Spec-Zone.ru › Qt 5.6

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

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

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

Инструкции импорта

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

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

Импорты файлов JavaScript должны быть квалифицированы при импорте, чтобы можно было получить доступ к предоставляемым ими свойствам и методам.

Общие формы различных импортов следующие:

  • import Namespace VersionMajor.VersionMinor
  • import Namespace VersionMajor.VersionMinor as SingletonTypeIdentifier
  • import "directory"
  • import "file.js" as ScriptIdentifier

Примеры:

  • import QtQuick 2.0
  • import QtQuick.LocalStorage 2.0 as Database
  • import "../privateComponents"
  • import "somefile.js" as Script

Для получения подробной информации об импортах QML см. документацию QML Синтаксис — Инструкции импорта.

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

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

Объявление объекта состоит из имени типа объекта, за которым следует набор фигурных скобок. Все атрибуты и дочерние объекты затем объявляются внутри этих скобок.

Вот простое объявление объекта:

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

Это объявляет объект типа Rectangle, за которым следует набор фигурных скобок, содержащий атрибуты, определённые для этого объекта. Тип Rectangle доступен модулем QtQuick, а определённые в данном случае атрибуты — значения свойств прямоугольника width, height и color. (Это свойства, предоставляемые типом Rectangle, как описано в документации Rectangle).

Движок может загрузить указанный выше объект, если он является частью QML-документа. То есть, если исходный код дополнен инструкцией import, импортирующей модуль QtQuick (для обеспечения доступности типа Rectangle), как показано ниже:

import QtQuick 2.0

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

При размещении в файле .qml и загрузке QML-движком указанный выше код создаёт объект Rectangle с использованием типа Rectangle, предоставленного модулем QtQuick:

Примечание: Если определение объекта содержит небольшое количество свойств, его можно записать в одной строке, разделив свойства точкой с запятой:

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

Очевидно, что объект Rectangle, объявленный в этом примере, очень прост, так как он определяет лишь несколько значений свойств. Для создания более полезных объектов объявление объекта может определять множество других типов атрибутов; они рассматриваются в документации QML атрибуты объектов. Кроме того, объявление объекта может определять дочерние объекты, как описано ниже.

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

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

Например, нижеприведённое объявление объекта Rectangle включает объявление объекта Gradient, которое, в свою очередь, содержит два объявления GradientStop:

import QtQuick 2.0

Rectangle {
    width: 100
    height: 100

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

При загрузке этого кода движком он создаёт дерево объектов с объектом Rectangle в корне; этот объект имеет дочерний объект Gradient, который, в свою очередь, имеет два дочерних объекта GradientStop.

Обратите внимание, что это родительско-потомковое отношение в контексте дерева QML-объектов, а не в контексте визуальной сцены. Концепция родительско-потомкового отношения в визуальной сцене предоставляется типом Item из модуля QtQuick, который является базовым типом для большинства QML-типов, поскольку большинство QML-объектов предназначены для визуального отображения. Например, Rectangle и Text — это оба типы, основанные на Item, и ниже объект Text объявлен как визуальный потомок объекта Rectangle:

import QtQuick 2.0

Rectangle {
    width: 200
    height: 200
    color: "red"

    Text {
        anchors.centerIn: parent
        text: "Hello, QML!"
    }
}

Когда объект Text ссылается на значение своего родительского элемента в приведенном выше коде, он ссылается на своего визуального родителя, а не на родителя в дереве объектов. В этом случае они совпадают: объект Rectangle является родителем объекта Text как в контексте дерева QML-объектов, так и в контексте визуальной сцены. Однако, в то время как свойство parent можно изменить, чтобы изменить визуального родителя, родитель объекта в контексте дерева объектов из QML изменить нельзя.

(Кроме того, обратите внимание, что объект Text был объявлен без присвоения его свойству объекта Rectangle, в отличие от предыдущего примера, который присваивал объект Gradient свойству прямоугольника gradient. Это связано с тем, что свойство children объекта Item установлено в качестве свойства по умолчанию для типа, чтобы обеспечить более удобный синтаксис.)

Для получения дополнительной информации о концепции визуального наследования с типом Item см. документацию визуального родителя.

Комментарии

Синтаксис комментариев в QML похож на синтаксис JavaScript:

  • Комментарии в одной строке начинаются с // и заканчиваются в конце строки.
  • Многострочные комментарии начинаются с /* и заканчиваются */
Text {
    text: "Hello world!"    //a basic greeting
    /*
        We want this text to stand out from the rest so
        we give it a large size and different font.
     */
    font.family: "Helvetica"
    font.pointSize: 24
}

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

Комментарии также можно использовать для предотвращения выполнения кода, что иногда полезно для отладки проблем.

Text {
    text: "Hello world!"
    //opacity: 0.5
}

В приведенном выше примере объект Text будет иметь обычную непрозрачность, поскольку строка opacity: 0.5 была преобразована в комментарий.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.6/qtqml-syntax-basics.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API