Migrar aplicaciones de QML 1 a QML 2

Al migrar aplicacoines QML de QML 1 a QML2 los desarrolladores debemos ser conscientes de que la infrastructura de QML ha experimentado cambios considerables en QML 2. A continuación describiremos aquellos estos cambios y el impacto que tienen en el código ya existente.

Cambios en el lenguaje QML

Hay muy pocos cambios en el lenguaje QML language que afecten a la migración de QML 1 a QML 2. Estos son:

La importación individual de ficheros ya no es funcional (por ejemplo, import “MyTipo.qml”). En su lugar, importar el directorio que lo contiene.

Las sendas relativas en ficheros JavaScript ahora se resuelve relatvas a la localización del fichero JavaScript en lugar del fichero QML que lo importó.

Ya no es posible anular las señales del componente base.

Módulo QtQuick

El módulo QtQuick ha sido actualizado a la versión 2. Todas las aplicaciones QML deberían actualizar sus setencias import para usar la nueva versión:

import QtQuick 2.4

Property and Method Changes

Las propiedades highlightMoveSpeed y highlightResizeSpeed del ListView han sido renombradas como highlightMoveVelocity y highlightResizeVelocity, respectivamente.

Los métodos openSoftwareInputPanel() y closeSoftwareInputPanel() de TextInput y de TextEdit han sido suprimidos. Usa la nueva propiedad Qt.inputMethod y llama Qt.inputMethod.show() Qt.inputMethod.hide() para mostrar y ocultar el teclado virtual.

Cambios en tipos y en el API

XmlListModel ha sido movido a su propio módulo, QtQuick.XmlListModel. Cualquier código que use los tipos XmlListModel y XmlRole debe importar QtQuick.XmlListModel en su lugar.

El API de almacenamiento local que habilita el soporte SQL se ha movido de QML Global Object al tipo singleton QtQuick.LocalStorage en su lugar. Ver la documentación sobre almacenamiento local de Qt Quick para ejemplos.

El tipo LayoutItem ha sido quitado del módulo de QtQuick ya que era específico para los gráficos vistos en el marco del backend usado en Qt Quick 1.

Cambios de comportamiento

QtQuick incluye varios cambios de comportamiento, por lo que recomendamos testear las aplicaciones tras su migración. Estos cambios no derivarán necesariamente en erorres de ejecución, pero pueden romper ciertas suposiciones en su código. A continuación estás los cambios más destacados a tener en cuenta cuando migres tus aplicaciones.

Opacidad y visibilidad de un ítem

El manejo de las entradas de los detalles de la opacidad y visibilidad han cambiado. Una opacidad de cero ya no afecta al manejo de la entrada, cuando antes paraba la entrada del ratón. Una visibilidad “false” ya no afecta a la entrada de teclado, pero aún detiene la entrada del ratón. La nueva propiedad habilitadad detiene las entradas de teclado y ratón, pero no afectan a cómo o si el ítem es renderizado. Una solución alternativa para aplicar el comportamiento antiguo, en la mayoría de los casos es enlazar a “enabled to” (visible && opacity > 0.0).

Anteriormente, si un ítem estaba en un posicionador (por ejempo, Row, Column, Grid y Flow) y la opacidad del ítem cambiaba a 0, o su valor de visibilidad cambiaba a “false”, el posicionador podría qutar el ítem de su layout y colaspar el espacio para ese ítem. En QtQuick 2, esto ahora solamente ocurre cuando la visibilidad de un ítem es “false”; la opacidad del ítem ya no afecta si el item se presenta. (Esto es consistente con el comportamiento existente de ListView y GridView).

Texto

La propiedad TextEdit::textFormat ahora por defecto es PlainText en lugar de AutoText.

Cuando Text::textFormat se pone a formato Text.AutoText, el objeto de texto automáticamente cambairá a Text.StyledText en lugar de Text.RichText.

Otros

Modificar Image::sourceSize ahora ajusta la imagen al tamaño, manteniendo la relación de aspecto.

Para ListView y GridView, la propiedad cacheBuffer ahora tiene un valor no-cero predeterminado y delega en la caché, son creados asíncronamente. También, usando un layout RightToLeft ahora también revierte preferredHighlightBegin y preferredHighlightEnd.

Para el Loader, las señales sourceChanged y sourceComponentChanged ahora son emitiidas solamente cuando cambia el valor de sus respectivas prorpiedades. (Antes, el Loader emitía ambas señales también cuando otras propiedades relevantes habían cambiado).

Cambios a módullos Qt.labs experimentales

El módulo Qt.labs.particles ha sido suprimido. Ha sido reemplazado por el módulo QtQuick.Particles module que mejora enormemente a su predecesor.

El módulo Qt.labs.shaders ha sido suprimido ya que los tipos ShaderEffectItem y ShaderEffectSource de este módulo han sido movidos al módulo QtQuick. A tener en cuenta que el tipo ShaderEffectItem ha sido renombrado como ShaderEffect.