Spec-Zone.ru › Qt

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

QML — многопарадигменый язык, позволяющий определять объекты в терминах их атрибутов и того, как они связаны и реагируют на изменения в других объектах. В отличие от чисто императивного кода, где изменения атрибутов и поведения выражаются через серию операторов, которые обрабатываются пошагово, декларативный синтаксис 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/qt-6.2/qtqml-syntax-basics.html

Spec-Zone.ru

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