Тип компонента QML
Инкапсулирует определение компонента QML. Подробнее...
| Заявление об импорте: | import QtQml 2.15 |
| Инициализирует: | QQmlComponent |
Свойства
Присоединенные сигналы
- completed()
- destruction()
Методы
- объект createObject(QtObject parent, object properties)
- строка errorString()
- объект incubateObject(Item parent, object properties, перечисление mode)
Подробное описание
Компоненты являются многократно используемыми, инкапсулированными типами QML с хорошо определенными интерфейсами.
Компоненты часто определяются файлами компонентов , т.е. .qml файлы. Тип Component по существу позволяет определять QML-компоненты встроенным способом, в пределах документа QML, а не в виде отдельного файла QML. Это может быть полезно для повторного использования небольшого компонента внутри файла QML или для определения компонента, который логически относится к другим компонентам QML в файле.
Например, вот компонент, используемый несколькими объектами Loader. Он содержит один элемент, Rectangle:
import QtQuick 2.0
Item {
width: 100; height: 100
Component {
id: redSquare
Rectangle {
color: "red"
width: 10
height: 10
}
}
Loader { sourceComponent: redSquare }
Loader { sourceComponent: redSquare; x: 20 }
} Обратите внимание, что, хотя Rectangle сам по себе автоматически отрисовывается и отображается, это не так для вышеуказанного прямоугольника, потому что он определен внутри Component. Компонент инкапсулирует типы QML внутри, как если бы они были определены в отдельном файле QML, и загружается только по запросу (в данном случае, двумя объектами Loader). Поскольку Component не является производным от Item, вы не можете привязать к нему ничего.
Определение Component аналогично определению документа QML. Документ QML имеет один главный элемент верхнего уровня, который определяет поведение и свойства этого компонента, и не может определять свойства или поведение вне этого главного элемента. Точно так же определение Component содержит один главный элемент верхнего уровня (который в приведенном выше примере является Rectangle) и не может определять какие-либо данные вне этого элемента, за исключением id (который в приведенном выше примере равен redSquare).
Тип Component обычно используется для предоставления графических компонентов для представлений. Например, свойство ListView::delegate требует Component для указания способа отображения каждого элемента списка.
Component объекты также могут быть созданы динамически с помощью Qt.createComponent().
Контекст создания
Контекст создания компонента соответствует контексту, где был объявлен компонент. Этот контекст используется в качестве родительского контекста (создание иерархии контекстов) при создании экземпляра компонента объектом, таким как ListView или Loader.
В следующем примере comp1 создается в корневом контексте MyItem.qml, и любые объекты, созданные из этого компонента, будут иметь доступ к идентификаторам и свойствам в этом контексте, таким как internalSettings.color. Когда comp1 используется в качестве делегата ListView в другом контексте (как в main.qml ниже), он по-прежнему будет иметь доступ к свойствам своего контекста создания (которые в противном случае были бы недоступны для внешних пользователей).
| MyItem.qml |
Item {
property Component mycomponent: comp1
QtObject {
id: internalSettings
property color color: "green"
}
Component {
id: comp1
Rectangle { color: internalSettings.color; width: 400; height: 50 }
}
} |
| main.qml |
ListView {
width: 400; height: 400
model: 5
delegate: myItem.mycomponent //will create green Rectangles
MyItem { id: myItem }
} |
Важно, чтобы срок службы контекста создания был больше, чем срок службы созданных объектов. Подробнее см. Поддержание динамически созданных объектов.
Документация по свойствам
progress : вещественное число
Прогресс загрузки компонента, от 0,0 (ничего не загружено) до 1,0 (загрузка завершена).
status : перечисление
Это свойство содержит статус загрузки компонента. Статус может быть одним из следующих:
- Component.Null - данные для компонента отсутствуют
- Component.Ready - компонент загружен и может быть использован для создания экземпляров.
- Component.Loading - компонент в процессе загрузки
- Component.Error - при загрузке компонента произошла ошибка. Вызов errorString() предоставит читаемое описание любой ошибки.
url : url
URL компонента. Это URL-адрес, который использовался для построения компонента.
Документация по присоединенным сигналам
completed()
Издается после того, как объект был создан. Это можно использовать для выполнения скриптового кода при запуске, после установления полной QML-среды.
Обработчик сигнала onCompleted может быть объявлен на любом объекте. Порядок выполнения обработчиков не определен.
Rectangle {
Component.onCompleted: console.log("Completed Running!")
Rectangle {
Component.onCompleted: console.log("Nested Completed Running!")
}
} Примечание: Соответствующий обработчик - onCompleted.
destruction()
Издается при начале уничтожения объекта. Это можно использовать для отмены работы, выполненной в ответ на сигнал completed() или другого императивного кода в вашем приложении.
Обработчик сигнала onDestruction может быть объявлен на любом объекте. Порядок выполнения обработчиков не определен.
Rectangle {
Component.onDestruction: console.log("Destruction Beginning!")
Rectangle {
Component.onDestruction: console.log("Nested Destruction Beginning!")
}
} Примечание: Соответствующий обработчик - onDestruction.
См. также Qt QML.
Документация по методам
объект createObject(QtObject parent, объект properties)
Создает и возвращает экземпляр объекта этого компонента, у которого будет указанный parent и properties. Аргумент properties необязателен. Возвращает null, если создание объекта не удалось.
Объект будет создан в том же контексте, что и контекст, в котором был создан компонент. Эта функция всегда возвращает null при вызове для компонентов, которые не были созданы в QML.
Если вы хотите создать объект без установки родителя, укажите null для значения parent. Обратите внимание, что если возвращаемый объект должен быть отображен, вы должны указать допустимое значение parent или установить свойство parent возвращаемого объекта, иначе объект не будет виден.
Если parent не предоставлен для createObject(), ссылка на возвращаемый объект должна быть сохранена, чтобы он не был уничтожен сборщиком мусора. Это верно независимо от того, установлено ли свойство Item::parent позже, потому что установка родительского элемента Item не изменяет владение объектом. Изменяется только графический родитель.
Начиная с QtQuick 1.1, этот метод принимает необязательный аргумент properties, который задает карту начальных значений свойств для созданного объекта. Эти значения применяются до завершения создания объекта. Это более эффективно, чем установка значений свойств после создания объекта, особенно в тех случаях, где определены большие наборы значений свойств, а также позволяет настроить привязки свойств (используя Qt.binding) до создания объекта.
Аргумент properties задается как карта элементов свойство-значение. Например, код ниже создает объект с начальными x и y значениями 100 и 100 соответственно:
var component = Qt.createComponent("Button.qml");
if (component.status == Component.Ready)
component.createObject(parent, {x: 100, y: 100}); Динамически созданные экземпляры могут быть удалены с помощью метода destroy(). Дополнительную информацию см. в разделе Динамическое создание QML-объектов из JavaScript.
См. также incubateObject().
строка errorString()
Возвращает читаемое описание любой ошибки.
Строка включает файл, расположение и описание каждой ошибки. Если присутствует несколько ошибок, они разделены символом новой строки.
Если ошибки нет, возвращается пустая строка.
объект incubateObject(Item parent, объект properties, перечисление mode)
Создает инкубатор для экземпляра этого компонента. Инкубаторы позволяют асинхронно создавать новые экземпляры компонента и не вызывают зависания пользовательского интерфейса.
Аргумент parent задает родителя созданного экземпляра. Пропуск параметра или передача null создаст объект без родителя. В этом случае ссылка на созданный объект должна быть сохранена, чтобы он не был уничтожен сборщиком мусора.
Аргумент properties задаётся как карта элементов свойство-значение, которые будут установлены на созданный объект во время его построения. mode может быть Qt.Synchronous или Qt.Asynchronous и управляет тем, создаётся ли экземпляр синхронно или асинхронно. По умолчанию используется асинхронный режим. В некоторых случаях, даже если указано Qt.Synchronous, инкубатор может создать объект асинхронно. Это происходит, если компонент, вызывающий incubateObject(), сам создаётся асинхронно.
Все три аргумента являются необязательными.
При успешном выполнении метод возвращает инкубатор, в противном случае null. У инкубатора есть следующие свойства:
- status Статус инкубатора. Допустимые значения: Component.Ready, Component.Loading и Component.Error.
- object Созданный экземпляр объекта. Будет доступен только после того, как инкубатор перейдёт в состояние Ready.
- onStatusChanged Указывает функцию обратного вызова, которая должна вызываться при изменении статуса. Статус передаётся в качестве параметра обратному вызову.
- forceCompletion() Вызов для завершения инкубации синхронно.
Следующий пример демонстрирует, как использовать инкубатор:
var component = Qt.createComponent("Button.qml");
var incubator = component.incubateObject(parent, { x: 10, y: 10 });
if (incubator.status != Component.Ready) {
incubator.onStatusChanged = function(status) {
if (status == Component.Ready) {
print ("Object", incubator.object, "is now ready!");
}
}
} else {
print ("Object", incubator.object, "is ready immediately!");
} Динамически созданные экземпляры можно удалить с помощью метода destroy(). Дополнительную информацию см. в статье Динамическое создание QML объектов из JavaScript.
См. такжеcreateObject().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qml-qtqml-component.html