Определение типов объектов с помощью QML-документов
Одним из основных свойств QML является то, что он позволяет легко определять типы QML-объектов в лёгкой форме с помощью QML-документов, удовлетворяющих потребностям отдельных приложений QML. Стандартный модуль Qt Quick предоставляет различные типы, такие как Прямоугольник, Текст и Изображение для построения приложения QML; помимо этого, вы можете легко определять свои собственные типы QML для повторного использования в приложении. Эта возможность создания собственных типов является основой любого приложения QML.
Определение типа объекта с помощью QML-файла
Именование пользовательских типов QML-объектов
Для создания типа объекта QML-документ должен быть помещён в текстовый файл с именем <TypeName>.qml, где <TypeName> — желаемое имя типа. Имя типа должно соответствовать следующим требованиям:
- Он должен состоять из буквенно-цифровых символов или символов подчеркивания.
- Он должен начинаться с заглавной буквы.
Этот документ автоматически распознаётся движком как определение типа QML. Кроме того, тип, определённый таким образом, автоматически становится доступным для других QML-файлов в той же директории, так как движок ищет в непосредственной директории при разрешении имён типов QML.
Определение пользовательского типа QML
Например, ниже приведён документ, который объявляет Прямоугольник с дочерним Областью мыши. Документ был сохранён в файле с именем SquareButton.qml.
// SquareButton.qml
import QtQuick 2.0
Rectangle {
property int side: 100
width: side; height: side
color: "red"
MouseArea {
anchors.fill: parent
onClicked: console.log("Button clicked!")
}
} Поскольку файл называется SquareButton.qml, теперь его можно использовать как тип с именем SquareButton в любом другом QML-файле в той же директории. Например, если в той же директории был файл myapplication.qml, он мог бы ссылаться на тип SquareButton:
// myapplication.qml
import QtQuick 2.0
SquareButton {} Это создаёт Прямоугольник красного цвета размером 100x100 с внутренней Областью мыши, как определено в SquareButton.qml. Когда этот myapplication.qml документ загружается движком, он загружает документ SquareButton.qml как компонент и инициализирует его для создания объекта SquareButton.
Тип SquareButton инкапсулирует дерево QML-объектов, объявленных в SquareButton.qml. Когда QML-движок инициализирует объект SquareButton из этого типа, он инициализирует объект из дерева Прямоугольников, объявленного в SquareButton.qml.
Примечание: регистр букв в имени файла имеет значение на некоторых (в особенности UNIX) файловых системах. Рекомендуется, чтобы регистр имени файла точно соответствовал регистру желаемого имени QML-типа — например, Box.qml , а не BoX.qml — независимо от платформы, на которую будет развернут QML-тип.
Импорт типов, определённых вне текущей директории
Если SquareButton.qml не находился в той же директории, что и myapplication.qml, типу SquareButton необходимо будет сделать доступным через оператор import в myapplication.qml. Он может быть импортирован из относительного пути на файловой системе или как установленный модуль; см. модуль для получения более подробной информации.
Доступные атрибуты пользовательских типов
Определение корневого объекта в файле .qml определяет атрибуты, которые доступны для QML-типа. Все свойства, сигналы и методы, принадлежащие этому корневому объекту — будь то пользовательские объявления или свойства QML-типа корневого объекта — внешне доступны и могут быть читаемы и изменены для объектов этого типа.
Например, корневой тип объекта в файле SquareButton.qml — Прямоугольник. Это означает, что любые свойства, определённые типом Прямоугольник, могут быть изменены для объекта SquareButton. Нижеприведённый код определяет три объекта SquareButton с настроенными значениями для некоторых свойств корневого объекта Прямоугольник типа SquareButton:
// application.qml
import QtQuick 2.0
Column {
SquareButton { side: 50 }
SquareButton { x: 50; color: "blue" }
SquareButton { radius: 10 }
} Атрибуты, которые доступны для объектов пользовательского QML-типа, включают любые пользовательские свойства, методы и сигналы, которые дополнительно были определены для объекта. Например, предположим, что Прямоугольник в SquareButton.qml был определён следующим образом с дополнительными свойствами, методами и сигналами:
// SquareButton.qml
import QtQuick 2.0
Rectangle {
id: root
property bool pressed: mouseArea.pressed
signal buttonClicked(real xPos, real yPos)
function randomizeColor() {
root.color = Qt.rgba(Math.random(), Math.random(), Math.random(), 1)
}
property int side: 100
width: side; height: side
color: "red"
MouseArea {
id: mouseArea
anchors.fill: parent
onClicked: root.buttonClicked(mouse.x, mouse.y)
}
} Любой объект SquareButton может использовать свойство pressed, сигнал buttonClicked и метод randomizeColor(), которые были добавлены к корневому Прямоугольнику:
// application.qml
import QtQuick 2.0
SquareButton {
id: squareButton
onButtonClicked: {
console.log("Clicked", xPos, yPos)
randomizeColor()
}
Text { text: squareButton.pressed ? "Down" : "Up" }
} Обратите внимание, что любые значения id , определённые в SquareButton.qml , недоступны для объектов SquareButton, так как значения id доступны только в области видимости компонента, в которой компонент объявлен. Объект SquareButton выше не может обратиться к mouseArea для обращения к дочернему Области мыши, и если у него был id со значением root вместо squareButton, это не конфликтовало бы со значением id для корневого объекта, определённого в SquareButton.qml, так как оба будут объявлены в разных областях видимости.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.14/qtqml-documents-definetypes.html