QML (Qt Meta-Object Language)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 22:28, 8 июня 2016.
QML
fraimed
Парадигма декларативный, скриптовый
Разработчики Qt Project
Портал: http://qt-project.org/doc/qt-5.1/qtquick/qtquick-index.html

QML (Qt Meta Language или Qt Modeling Language [ ˈmet.əˈlæŋɡwɪdʒ ]) является языком разметки интерфейса пользователя. Это основанный на JavaScript, декларативный язык для проектирования приложений. Он является частью Qt Quick, инструментом для создания пользовательских интерфейсм, разработанным Nokia в рамках фреймворка Qt. QML используется в основном для мобильных приложений с сенсорным вводом и fluid анимацией (60 FPS). Документы QML описывают дерево объектов-элементов. QML элементы, входящие в состав Qt являются сложным набором блоков, графических объектов (прямоугольники, изображения и т.д.) и объектами-поведеня (например, состояниями, переходами, анимациями). Эти элементы могут быть объединены для создания сложных компонентов: начиная от простых кнопок и слайдеров и завершая поддерживающими интернет-соединение программами.

Элементы QML могут быть расширены с помощью стандартного JavaScript: как inline, так и через включенные .js файлы. Элементы могут быть также интегрированы и расширены при помощи компонентов C ++, использующиъ фреймворк Qt.

Основы синтаксиса QML

QML это мульти-парадигменный язык, позволяющий определять объекты в терминах их атрибутов и их отношений, реакций на изменения в других объектах. В отличие от чисто императивного кода, где изменения в атрибутах и поведении выражены посредством ряда выражений, которые обрабатываются шаг за шагом, QML интегрирует атрибут и поведенческие изменения непосредственно в определения отдельных объектов. Затем, когда необходимо определить сложное поведение, эти определения атрибутов могут включать в себя императивный код.

Импорт выражений

Документ QML может иметь один или несколько импортов, объявленных в верхней части файла. Импорт может быть:

  • версионным пространством имен, в которомбыли зарегистрированы типы (например, с помощью плагина)
  • каталогом, который содержит определения типов в виде QML-документа файлом JavaScript

Объявление объектов

Синтаксически блок QML кода определяет дерево QML объектов, которые должны быть созданы. Объекты определяются с помощью деклараций объектов, которые описывают тип объекта, который будет создан, а также атрибуты, которые должны быть у объекта. Объявление объекта состоит из типа объекта, с последующим набором фигурных скобок. Все атрибуты и дочерние объекты объявляются внутри этих скобок. Вот простой пример объявления объекта:

Rectangle {
    width: 100
    height: 100
    color: "red"
}

Здесь описывается объект типа Rectangle, имеющий ряд аттрибутов, описанных в скобках. Тип Rectangle доступен в модуле QtQuick, и соответстующие аттрибуты описывают ширину, высоту и цвет прямоугольника.

Дочерние объекты

Любое описание объектов может включать в себя дочерние объекты, описанные во вложенных скобках. Таким образом, любой объект неявно описывает дерево объектов, которое может содержать любое число дочерних объектов. Например, описание объекта Rectangle ниже, включает описание градиента, который, в свою очередь содержит два объявления GradientStop:

import QtQuick 2.0
Rectangle {
    width: 100
    height: 100

    gradient: Gradient {
        GradientStop { position: 0.0; color: "yellow" }
        GradientStop { position: 1.0; color: "green" }
    }
}

Аттрибуты в Объявлении объектов

Описание объекта в документе QML определяет новый тип. Он также описывает иерархию объектов, которые будут будут создаваться. Множество атрибутов, которые есть у объектов в QML:

  • id аттрибут
  • аттрибуты свойств
  • аттрибуты сигналов
  • аттрибуты сигнал-хэндлеров
  • аттрибуты методов
  • аттрибуты привязанных свойств, сигналов и хэндлеров

Система типов QML

Типы, которые могут быть использованы в определении иерархии объектов в QML документе, могут быть описаны в разных местах:

  1. предоставляться языком QML нативно
  2. быть зарегистрированными через C++ при помощи QML модулей
  3. предоставляться в виде QML документов

Кроме того, разработчики приложений могут создавать свои собственные типы, либо путем регистрации C++ типов, либо путем определения многократно используемых компонентов в документах QML, который могут быть импортированы впоследствие. В зависимости от места объявления, движок будет обеспечивать безопасность типов для свойств и экземпляров этих типов.

Базовые типы QML

QML поддерживает множество базовых типов

Базовый тип - это такой тип, который описывает простое значение: int или string. Это контрастирует с QML Object Types, которые имеют свойства, сигналы, методы и так далее. В отличие от типа объекта, базовый тип не может быть использован для объявления объектов QML: не возможно, например, объявить объект int{} или объект size{}.

Базовые типы могут быть использованы для определения:

  • Единичного значения (например, int определяет одно число, var может определять к одному списку)
  • Значения, содержащее простое множество пар свойство-значение

Поддерживаемые базовые типы

Некоторые базовые типы поддерживаются движком по умолчанию и не требует оператора импорта для использования, в то время как другие требуют импортирования модуля, который обеспечивает их объявление. Все основные типы, перечисленные ниже, могут быть использованы в качестве типа свойств в XML документе, со следующими исключениями: list должен быть использован в сочетании с типом объекта QML enum не может быть использован непосредственно, перечисление должно быть определено зарегистрированным типом QML объекта.

Базовые типы, поддерживаемые языком QML

Тип Описание
bool Binary true/false value
double Number with a decimal point, stored in double precision
enumeration Named enumeration value
int Whole number, e.g. 0, 10, or -20
list List of QML objects
real Number with a decimal point
string Free form text string
url Resource locator
var Generic property type

Базовые типы, доступные при помощи модулей QML

QML модули могут расширять язык набором типов. Например, ниже перечислены типы, предоставляемые модулем:

Тип Описание
color ARGB color value. The type refers to an ARGB color value. It can be specified in a number of ways:
date Date value
font Font value with the properties of QFont. The type refers to a font value with the properties of QFont
matrix4x4 A matrix4x4 type is a 4-row and 4-column matrix
point Value with x and y attributes
quaternion A quaternion type has scalar, x, y, and z attributes
rect Value with x, y, width and height attributes
size Value with width and height attributes
vector2d A vector2d type has x and y attributes
vector3d Value with x, y, and z attributes
vector4d A vector4d type has x, y, z and w attributes

Типы JavaScript

JavaScript объекты и массивы поддерживаются движком QML. Любой стандартный тип JavaScript может быть создан и сохранен с использованием дженерик-типа var. Например, доступны стандартные типы Date и Array:

import QtQuick 2.0

Item {
    property var theArray: new Array()
    property var theDate: new Date()

    Component.onCompleted: {
        for (var i = 0; i < 10; i++)
            theArray.push("Item " + i)
        console.log("There are", theArray.length, "items in the array")
        console.log("The time is", theDate.toUTCString())
    }
}

Ссылки