QML ( Qt Meta-object Language [ 3 ] ) es un lenguaje de marcado de interfaz de usuario . Es un lenguaje declarativo (similar a CSS y JSON ) para diseñar aplicaciones centradas en la interfaz de usuario . Los aspectos imperativos se manejan mediante código JavaScript en línea . Está asociado con Qt Quick , el kit de creación de interfaz de usuario desarrollado originalmente por Nokia dentro del marco Qt . Qt Quick se utiliza para aplicaciones móviles donde la entrada táctil, las animaciones fluidas y la experiencia de usuario son cruciales. QML también se utiliza con Qt3D [ 4 ] para describir una escena 3D y una metodología de renderizado de "gráfico de fotogramas". Un documento QML describe un árbol de objetos jerárquico. Los módulos QML [ 5 ] incluidos en Qt incluyen bloques de construcción gráficos primitivos (por ejemplo, Rectángulo, Imagen), componentes de modelado (por ejemplo, FolderListModel, XmlListModel), componentes de comportamiento (por ejemplo, TapHandler, DragHandler, Estado, Transición, Animación) y controles más complejos (por ejemplo, Botón, Deslizador, Cajón, Menú). Estos elementos se pueden combinar para crear componentes de diversa complejidad, desde simples botones y controles deslizantes hasta programas completos con conexión a internet.
Los elementos QML pueden ampliarse con JavaScript estándar , tanto directamente como mediante archivos .js incluidos. Además, los elementos pueden integrarse y extenderse fácilmente con componentes C++ utilizando el framework Qt.
QML es el lenguaje; su entorno de ejecución JavaScript es el motor V4 personalizado, [ 6 ] desde Qt 5.2; [ 7 ] y Qt Quick es el grafo de escena 2D y el marco de interfaz de usuario basado en él. Todo esto forma parte del módulo Qt Declarative, aunque la tecnología ya no se llama Qt Declarative.
El código QML y JavaScript se puede compilar en binarios nativos de C++ con el compilador Qt Quick. [ 8 ] Alternativamente, existe un formato de archivo de caché QML [ 9 ] que almacena una versión compilada de QML dinámicamente para un inicio más rápido la próxima vez que se ejecute.
Adopción
- KDE Plasma 4 , [ 10 ] KDE Plasma 5 y KDE Plasma 6 a través de Plasma-framework
- Sistema operativo Liri
- Administrador de pantalla de escritorio simple
- Dispositivo tableta reMarkable [ 11 ] [ 12 ]
- Unity2D [ 13 ]
- Sistema operativo Sailfish [ 14 ] [ 15 ] [ 16 ]
- BlackBerry 10 [ 17 ]
- MeeGo [ 18 ] [ 19 ]
- Maemo [ 20 ]
- Tizen [ 21 ]
- Mer [ 22 ] [ 23 ] [ 24 ]
- Teléfono Ubuntu [ 25 ]
- Lumina (entorno de escritorio) [ 26 ]
- Muchas aplicaciones de código abierto
Sintaxis, semántica
A continuación se muestran algunos ejemplos de sintaxis :
Sintaxis básica
importar QtQuickRectángulo { id: canvas ancho: 250 alto: 200 color: "azul"Imagen { id: logo source: "pics/logo.png" anchors.centerIn: parent x: canvas . height / 5 } }Los objetos se especifican por su tipo, seguido de un par de llaves. Los tipos de objetos siempre comienzan con mayúscula. En el ejemplo anterior, hay dos objetos: un Rectángulo y su hijo, una Imagen. Entre las llaves, se puede especificar información sobre el objeto, como sus propiedades. Las propiedades se especifican como propiedad: valor. En el ejemplo anterior, la Imagen tiene una propiedad llamada source, a la que se le ha asignado el valor pics/logo.png. La propiedad y su valor están separados por dos puntos.
La propiedad id
A cada objeto se le puede asignar una propiedad única especial llamada ID. Asignar un ID permite que otros objetos y scripts hagan referencia al objeto. El primer elemento Rectángulo que se muestra a continuación tiene un ID, myRect. El segundo elemento Rectángulo define su propio ancho haciendo referencia a myRect.width, lo que significa que tendrá el mismo valor de ancho que el primer elemento Rectángulo.
Elemento { Rectángulo { id: myRect ancho: 120 alto: 100 } Rectángulo { ancho: myRect . ancho alto : 200 } }Un identificador debe comenzar con una letra minúscula o un guion bajo, y no puede contener otros caracteres que no sean letras, dígitos y guiones bajos.
Vinculaciones de propiedad
La vinculación de propiedades especifica el valor de una propiedad de forma declarativa. El valor de la propiedad se actualiza automáticamente si cambian las demás propiedades o los valores de los datos, siguiendo el paradigma de programación reactiva .
En QML, las vinculaciones de propiedades se crean implícitamente siempre que se asigna una expresión JavaScript a una propiedad. El siguiente código QML utiliza dos vinculaciones de propiedades para relacionar el tamaño del rectángulo con el de otro elemento.
Rectángulo { ancho: otherItem . ancho alto: otherItem . alto }QML extiende un motor JavaScript que cumple con los estándares, por lo que cualquier expresión JavaScript válida puede usarse como enlace de propiedades. Los enlaces pueden acceder a las propiedades de los objetos, realizar llamadas a funciones e incluso usar objetos JavaScript integrados como Date y Math.
Rectángulo { función calcularMiAltura () { return Math . max ( otherItem . height , thirdItem . height ); } anchors.centerIn: parent width: Math . min ( otherItem . width , 10 ) height: calcularMiAltura () color: width > 10 ? "azul" : "rojo" }Estados
Los estados son un mecanismo para combinar cambios en las propiedades de una unidad semántica. Un botón, por ejemplo, tiene un estado pulsado y otro no pulsado; una aplicación de agenda podría tener un estado de solo lectura y otro de edición para los contactos. Cada elemento tiene un estado base implícito. Los demás estados se describen enumerando las propiedades y los valores de aquellos elementos que difieren del estado base.
Ejemplo: En su estado predeterminado, myRect se encuentra en la posición 0,0. En el estado "movido", se encuentra en la posición 50,50. Al hacer clic dentro del área del ratón, el estado cambia del estado predeterminado al estado "movido", desplazando así el rectángulo.
importar QtQuickElemento { id: myItem ancho: 200 ; alto: 200Rectángulo { id: myRect ancho: 100 ; alto: 100 color: "rojo" } estados: [ Estado { nombre: "movido" CambiosDePropiedad { objetivo: myRect x: 50 y: 50 } } ] ÁreaDeRatón { anclajes.rellenar: padre alHacerClic: myItem . estado = 'movido' } }Los cambios de estado se pueden animar mediante transiciones.
Por ejemplo, al agregar este código al elemento Item anterior, se anima la transición al estado "movido":
transiciones: [ Transición { de: "*" a: "movido" AnimaciónNúmero { propiedades: "x,y" ; duración: 500 } } ]Animación
En QML, las animaciones se realizan animando las propiedades de los objetos. Se pueden animar propiedades de tipo real, int, color, rect, point, size y vector3d.
QML admite tres formas principales de animación: animación básica de propiedades, transiciones y comportamientos de propiedades.
La forma más sencilla de animación es PropertyAnimation, que puede animar todos los tipos de propiedades mencionados anteriormente. Una animación de propiedad se puede especificar como origen de valor mediante la sintaxis Animation on property. Esto resulta especialmente útil para animaciones repetitivas.
El siguiente ejemplo crea un efecto de rebote:
Rectángulo { id: rect ancho: 120 ; alto: 200Imagen { id: img source: "pics/qt.png" x: 60 - img . width / 2 y: 0Animación secuencial en y { bucles: Animación.Infinito AnimaciónNúmero { a : 200 - img.altura ; tipo de suavizado : suavizado.OutBounce ; duración: 2000 } AnimaciónPausa { duración: 1000 } AnimaciónNúmero { a: 0 ; tipo de suavizado : suavizado.OutQuad ; duración: 1000 } } } }Integración de Qt/C++
El uso de QML no requiere conocimientos de Qt/C++, pero se puede extender fácilmente a través de Qt. [ 27 ] [ 28 ] Cualquier clase de C++ derivada de QObject se puede registrar fácilmente como un tipo que luego se puede instanciar en QML.
Conceptos familiares
QML proporciona acceso directo a los siguientes conceptos de Qt:
- Señales de QObject: pueden activar devoluciones de llamada en JavaScript.
- Ranuras de QObject: disponibles como funciones para llamar en JavaScript.
- Propiedades de QObject: disponibles como variables en JavaScript y para enlaces.
- QWindow – Window crea una escena QML en una ventana.
- Q*Model – utilizado directamente en el enlace de datos (por ejemplo, QAbstractItemModel) [ 29 ] [ 30 ] [ 31 ]
Manipuladores de señales
Los manejadores de señales son funciones de devolución de llamada de JavaScript que permiten realizar acciones imperativas en respuesta a un evento. Por ejemplo, el elemento MouseArea tiene manejadores de señales para gestionar la pulsación, la liberación y el clic del ratón:
MouseArea { onPressed : console.log ( "botón del ratón pulsado " ) }Todos los nombres de los manejadores de señales comienzan con "on".
Herramientas de desarrollo
Dado que QML y JavaScript son muy similares, prácticamente todos los editores de código compatibles con JavaScript funcionarán. El entorno de desarrollo integrado (IDE) multiplataforma gratuito Qt Creator, desde la versión 2.1, y muchos otros IDE ofrecen compatibilidad total con resaltado de sintaxis , autocompletado de código, ayuda integrada y un editor WYSIWYG .
El ejecutable qml permite ejecutar un archivo QML como un script. Si el archivo QML comienza con una línea shebang, se puede ejecutar directamente. Sin embargo, para empaquetar una aplicación para su implementación (especialmente en plataformas móviles), generalmente se requiere escribir un lanzador simple en C++ y empaquetar los archivos QML necesarios como recursos.
Referencias
- ↑ "Qt 6.8 lanzado" .
- ↑ "¿Qué interfaz para una aplicación moderna?" . scriptol .
- ↑ "Tutorial rápido de Qt" . 7 de agosto de 2020. Consultado el 9 de marzo de 2025 .
- ↑ "Descripción general de Qt 3D: Qt 3D 5.13.1" . doc.qt.io .
- ↑ "Todos los tipos QML: Qt 5.13" . doc.qt.io. Consultado el 7 de septiembre de 2019 .
- ↑ Knoll, Lars (15 de abril de 2013). "Evolución del motor QML, parte 1" . Recuperado el 11 de mayo de 2018 .
- ↑ "Novedades de Qt 5.2" . Consultado el 11 de mayo de 2018 .
- ↑ "Qt Quick Compiler" . Consultado el 7 de septiembre de 2019 .
- ↑ "Implementación de aplicaciones QML: Qt 5.13" . doc.qt.io. Consultado el 7 de septiembre de 2019 .
- ^ "Desarrollo/Tutoriales/Plasma4/QML/GettingStarted" . Base técnica de KDE . KDE.
- ↑ Dragly, Svenn-Arne (diciembre de 2017). "Desarrollo para la tableta reMarkable" . dragly . Archivado del original el 14 de septiembre de 2018. Consultado el 3 de enero de 2018 .
- ↑ "Demostración de QML para la tableta de papel reMarkable" . GitHub . 9 de marzo de 2022.
- ↑ "Unity de Ubuntu escrito en Qt/QML para "Unity Next"" Michael Larabel.
- ↑ "Combinando C++ con QML en aplicaciones de Sailfish OS" .
- ↑ "Tutorial - Programación en vivo con QML usando Qt QmlLive" .
- ↑ "QML a C++ y C++ a QML" . Jolla. Archivado del original el 24 de marzo de 2023. Consultado el 3 de enero de 2018 .
- ↑ "Fundamentos de QML" . Blackberry.
- ↑ "Introducción a QML para Meego" . Nokia. Archivado del original el 4 de enero de 2018. Consultado el 3 de enero de 2018 .
- ↑ "MeeGo y las demostraciones de Qt-QML irrumpen en el MWC" . IoT Gadgets. 23 de febrero de 2011.
- ↑ "QML en N900" . maemo.org . Comunidad Maemo. Archivado del original el 24 de marzo de 2023. Consultado el 3 de enero de 2018 .
- ↑ "Qt se lanza en Tizen con apariencia y funcionamiento estándar" . 20 de mayo de 2013.
- ↑ "Mer" .
- ↑ "Mer wiki" .
- ↑ "Interfaz de usuario QML tipo lápiz labial en MeeGo CE / Mer" . Dispositivos IoT. 6 de octubre de 2011.
- ↑ "QML: la mejor herramienta para liberar tu creatividad" . Ubuntu.
- ↑ "Analizando Lumina Desktop 2.0" . TrueOS. 19 de agosto de 2020.
- ↑ Alpert, Alan. "The Qt/QML User Story" . Incorrigible Imaginings . Archivado del original el 17 de junio de 2019. Consultado el 17 de junio de 2019 .
- ↑ Alpert, Alan. "Las muchas maneras de unir QML y C++" . Qt Developer Days . BlackBerry. Archivado del original el 17 de junio de 2019. Consultado el 17 de junio de 2019 .
- ↑ Dahlbom, J. (22 de abril de 2010). "QAbstractItemModels en vistas QML" . Las piezas que faltan .
- ↑ "Ordenar y filtrar una TableView" . The Qt Company.
- ↑ van der Laan, Brad (11 de julio de 2014). "Cómo usar QSortFilterProxyModel de Qt" . ImaginativeThinking .
Enlaces externos
- Documentación de referencia de QML
- Primeros pasos con QML
- Ejemplos y tutoriales de QML
- Blog de Qt
- Tutorial de QML
- Guías para desarrolladores de Qt
- Exportación de QML desde Photoshop y GIMP
- Libro QML
Cómo hacerlo
- Integración de QML y C++
- Clases importantes de C++ proporcionadas por el módulo Qt QML.
- lenguajes de programación declarativos
- Motores JavaScript
- Qt (software)
- lenguajes de marcado de interfaz de usuario