Класс QQmlComponent
Класс QQmlComponent инкапсулирует определение компонента QML. Подробнее...
| Заголовок: | #include <QQmlComponent> |
| qmake: | QT += qml |
| С момента: | Qt 5.0 |
| Инициализируется: | Component |
| Наследует: | QObject |
Этот класс был представлен в Qt 5.0.
Открытые типы
| Перечисление | CompilationMode { PreferSynchronous, Asynchronous } |
| Перечисление | Status { Null, Ready, Loading, Error } |
Свойства
Открытые функции
| QQmlComponent(QQmlEngine *engine, const QUrl &url, QQmlComponent::CompilationMode mode, QObject *parent = nullptr) | |
| QQmlComponent(QQmlEngine *engine, const QUrl &url, QObject *parent = nullptr) | |
| QQmlComponent(QQmlEngine *engine, const QString &fileName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr) | |
| QQmlComponent(QQmlEngine *engine, const QString &fileName, QObject *parent = nullptr) | |
| QQmlComponent(QQmlEngine *engine, QObject *parent = nullptr) | |
| virtual | ~QQmlComponent() override |
| virtual QObject * | beginCreate(QQmlContext *publicContext) |
| virtual void | completeCreate() |
| virtual QObject * | create(QQmlContext *context = nullptr) |
| void | create(QQmlIncubator &incubator, QQmlContext *context = nullptr, QQmlContext *forContext = nullptr) |
| QQmlContext * | creationContext() const |
| QQmlEngine * | engine() const |
| QList<QQmlError> | errors() const |
| bool | isError() const |
| bool | isLoading() const |
| bool | isNull() const |
| bool | isReady() const |
| qreal | progress() const |
| QQmlComponent::Status | status() const |
| QUrl | url() const |
Открытые слоты
| void | loadUrl(const QUrl &url, QQmlComponent::CompilationMode mode) |
| void | loadUrl(const QUrl &url) |
| void | setData(const QByteArray &data, const QUrl &url) |
Сигналы
| void | progressChanged(qreal progress) |
| void | statusChanged(QQmlComponent::Status status) |
Подробное описание
Компоненты — это многократно используемые, инкапсулированные типы QML с чётко определёнными интерфейсами.
Экземпляр QQmlComponent можно создать из файла QML. Например, если есть файл main.qml, подобный этому:
import QtQuick 2.0
Item {
width: 200
height: 200
} Следующий код загружает этот файл QML как компонент, создаёт экземпляр этого компонента с помощью create() и затем запрашивает значение Item's width:
QQmlEngine *engine = new QQmlEngine;
QQmlComponent component(engine, QUrl::fromLocalFile("main.qml"));
QObject *myObject = component.create();
QQuickItem *item = qobject_cast<QQuickItem*>(myObject);
int width = item->width(); // width = 200 Для создания экземпляров компонента в коде, где нет экземпляра QQmlEngine, можно использовать qmlContext() или qmlEngine(). Например, в приведённом ниже сценарии дочерние элементы создаются внутри подкласса QQuickItem:
void MyCppItem::init()
{
QQmlEngine *engine = qmlEngine(this);
// Or:
// QQmlEngine *engine = qmlContext(this)->engine();
QQmlComponent component(engine, QUrl::fromLocalFile("MyItem.qml"));
QQuickItem *childItem = qobject_cast<QQuickItem*>(component.create());
childItem->setParentItem(this);
} Обратите внимание, что эти функции вернут null при вызове внутри конструктора подкласса QObject, так как экземпляр ещё не имеет контекста ни движка.
Компоненты сети
Если URL, переданный QQmlComponent, является сетевым ресурсом, или если документ QML ссылается на сетевой ресурс, QQmlComponent должен извлечь сетевые данные, прежде чем сможет создать объекты. В этом случае у QQmlComponent будет статус Loading status. Приложение должно подождать, пока компонент не станет Ready, прежде чем вызывать QQmlComponent::create().
Следующий пример демонстрирует загрузку файла QML из сетевого ресурса. После создания QQmlComponent он проверяет, загружается ли компонент. Если да, он подключается к сигналу QQmlComponent::statusChanged(), в противном случае вызывает метод continueLoading() напрямую. Обратите внимание, что QQmlComponent::isLoading() может быть false для сетевого компонента, если компонент был кэширован и готов сразу.
MyApplication::MyApplication()
{
// ...
component = new QQmlComponent(engine, QUrl("http://www.example.com/main.qml"));
if (component->isLoading())
QObject::connect(component, SIGNAL(statusChanged(QQmlComponent::Status)),
this, SLOT(continueLoading()));
else
continueLoading();
}
void MyApplication::continueLoading()
{
if (component->isError()) {
qWarning() << component->errors();
} else {
QObject *myObject = component->create();
}
} Документация по типам членов
перечисление QQmlComponent::CompilationMode
Определяет, должен ли QQmlComponent загрузить компонент сразу или асинхронно.
| Константа | Значение | Описание |
|---|---|---|
QQmlComponent::PreferSynchronous |
0 |
Предпочитать загрузку/компиляцию компонента сразу, блокируя поток. Это не всегда возможно; например, удалённые URL всегда загружаются асинхронно. |
QQmlComponent::Asynchronous |
1 |
Загрузить/скомпилировать компонент в фоновом потоке. |
перечисление QQmlComponent::Status
Указывает состояние загрузки QQmlComponent.
| Константа | Значение | Описание |
|---|---|---|
QQmlComponent::Null |
0 |
У этого QQmlComponent нет данных. Вызовите loadUrl() или setData(), чтобы добавить QML-контент. |
QQmlComponent::Ready |
1 |
Этот QQmlComponent готов, и можно вызвать create(). |
QQmlComponent::Loading |
2 |
Этот QQmlComponent загружает сетевые данные. |
QQmlComponent::Error |
3 |
Произошла ошибка. Вызовите errors(), чтобы получить список ошибок. |
Документация свойств
progress : const qreal
Прогресс загрузки компонента, от 0.0 (ничего не загружено) до 1.0 (загрузка завершена).
Функции доступа:
| qreal | progress() const |
Сигнал уведомления:
| void | progressChanged(qreal progress) |
status : const Status
Текущий статус компонента.
Функции доступа:
| QQmlComponent::Status | status() const |
Сигнал уведомления:
| void | statusChanged(QQmlComponent::Status status) |
url : const QUrl
URL компонента. Это URL, переданный в конструктор или методы loadUrl() или setData().
Функции доступа:
| QUrl | url() const |
Документация функций-членов
QQmlComponent::QQmlComponent(QQmlEngine *engine, const QUrl &url, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)
Создает QQmlComponent по заданному url, устанавливая указанный parent и engine. Если mode равен Asynchronous, компонент будет загружен и скомпилирован асинхронно.
Убедитесь, что предоставленный URL полный и корректный, особенно используйте QUrl::fromLocalFile(), при загрузке файла из локальной файловой системы.
Относительные пути будут разрешены относительно QQmlEngine::baseUrl(), который по умолчанию – текущая рабочая директория.
См. также loadUrl().
QQmlComponent::QQmlComponent(QQmlEngine *engine, const QUrl &url, QObject *parent = nullptr)
Создает QQmlComponent по заданному url, устанавливая указанный parent и engine.
Убедитесь, что предоставленный URL полный и корректный, особенно используйте QUrl::fromLocalFile(), при загрузке файла из локальной файловой системы.
Относительные пути будут разрешены относительно QQmlEngine::baseUrl(), который по умолчанию – текущая рабочая директория.
См. также loadUrl().
QQmlComponent::QQmlComponent(QQmlEngine *engine, const QString &fileName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)
Создает QQmlComponent по заданному fileName, устанавливая указанный parent и engine. Если mode равен Asynchronous, компонент будет загружен и скомпилирован асинхронно.
См. также loadUrl().
QQmlComponent::QQmlComponent(QQmlEngine *engine, const QString &fileName, QObject *parent = nullptr)
Создает QQmlComponent по заданному fileName, устанавливая указанный parent и engine.
См. также loadUrl().
QQmlComponent::QQmlComponent(QQmlEngine *engine, QObject *parent = nullptr)
Создает QQmlComponent без данных, устанавливая указанный engine и parent. Установите данные с помощью setData().
[slot] void QQmlComponent::loadUrl(const QUrl &url, QQmlComponent::CompilationMode mode)
Загружает QQmlComponent по предоставленному url. Если mode равен Asynchronous, компонент будет загружен и скомпилирован асинхронно.
Убедитесь, что предоставленный URL полный и корректный, особенно используйте QUrl::fromLocalFile(), при загрузке файла из локальной файловой системы.
Относительные пути будут разрешены относительно QQmlEngine::baseUrl(), который по умолчанию – текущая рабочая директория.
[slot] void QQmlComponent::loadUrl(const QUrl &url)
Загружает QQmlComponent по предоставленному url.
Убедитесь, что предоставленный URL полный и корректный, особенно используйте QUrl::fromLocalFile(), при загрузке файла из локальной файловой системы.
Относительные пути будут разрешены относительно QQmlEngine::baseUrl(), который по умолчанию – текущая рабочая директория.
[signal] void QQmlComponent::progressChanged(qreal progress)
Используется при изменении прогресса загрузки компонента. progress — текущий прогресс от 0.0 (ничего не загружено) до 1.0 (загрузка завершена).
Примечание: Сигнал уведомления для свойства progress.
[slot] void QQmlComponent::setData(const QByteArray &data, const QUrl &url)
Устанавливает для QQmlComponent предоставленные QML-данные data. Если предоставлен url, он используется для установки имени компонента и предоставления базового пути для элементов, разрешаемых этим компонентом.
[signal] void QQmlComponent::statusChanged(QQmlComponent::Status status)
Используется при изменении статуса компонента. status — новый статус.
Примечание: Сигнал уведомления для свойства status.
[override virtual] QQmlComponent::~QQmlComponent()
Деструктор QQmlComponent.
[virtual] QObject *QQmlComponent::beginCreate(QQmlContext *publicContext)
Этот метод обеспечивает расширенный контроль над созданием экземпляров компонента. В общем случае программисты должны использовать QQmlComponent::create() для создания экземпляров объектов.
Создает экземпляр объекта из этого компонента. Возвращает nullptr если создание не удалось. publicContext определяет контекст, в котором нужно создать экземпляр объекта.
При создании экземпляра QQmlComponent происходит в три этапа:
- Создается иерархия объектов и назначаются константные значения.
- Связывания свойств вычисляются в первый раз.
- Если применимо, вызывается QQmlParserStatus::componentComplete() для объектов.
QQmlComponent::beginCreate() отличается от QQmlComponent::create() тем, что выполняет только шаг 1. Необходимо вызвать QQmlComponent::completeCreate() для завершения шагов 2 и 3.
Эта точка разрыва иногда полезна при использовании присоединённых свойств для передачи информации экземпляру компонента, так как позволяет настроить их начальные значения до вступления в силу привязок свойств.
Владение экземпляром возвращаемого объекта передаётся вызывающему коду.
См. также completeCreate() и QQmlEngine::ObjectOwnership.
[virtual] void QQmlComponent::completeCreate()
Этот метод обеспечивает расширенный контроль над созданием экземпляра компонента. В целом, программисты должны использовать QQmlComponent::create() для создания компонента.
Эта функция завершает создание компонента, начатое с QQmlComponent::beginCreate(), и должна вызываться после неё.
См. также beginCreate().
[virtual] QObject *QQmlComponent::create(QQmlContext *context = nullptr)
Создаёт экземпляр объекта из этого компонента. Возвращает nullptr в случае неудачи создания. context определяет контекст, в котором следует создать экземпляр объекта.
Если context равен nullptr (по умолчанию), он создаст экземпляр в корневом контексте корневого контекста движка.
Владение возвращаемым экземпляром объекта передаётся вызывающему коду.
Если объект, создаваемый из этого компонента, является визуальным элементом, он должен иметь визуального родителя, который можно установить, вызвав QQuickItem::setParentItem(). См. Концепции - Визуальный родитель в Qt Quick для получения дополнительной информации.
См. также QQmlEngine::ObjectOwnership.
void QQmlComponent::create(QQmlIncubator &incubator, QQmlContext *context = nullptr, QQmlContext *forContext = nullptr)
Создаёт экземпляр объекта из этого компонента с использованием предоставленного incubator. context определяет контекст, в котором следует создать экземпляр объекта.
Если context равен 0 (по умолчанию), он создаст экземпляр в корневом корневом контексте движка.
forContext указывает контекст, от которого зависит создание этого объекта. Если forContext создаётся асинхронно, и QQmlIncubator::IncubationMode равен QQmlIncubator::AsynchronousIfNested, этот объект также будет создан асинхронно. Если forContext равен 0 (по умолчанию), для этого решения будет использован context.
Созданный объект и его состояние создания доступны через incubator.
См. также QQmlIncubator.
QQmlContext *QQmlComponent::creationContext() const
Возвращает QQmlContext, в котором был создан компонент. Это справедливо только для компонентов, созданных непосредственно из QML.
QQmlEngine *QQmlComponent::engine() const
Возвращает QQmlEngine этого компонента.
Эта функция была добавлена в Qt 5.12.
QList<QQmlError> QQmlComponent::errors() const
Возвращает список ошибок, возникших во время последней операции компиляции или создания. Возвращается пустой список, если isError() не установлен.
bool QQmlComponent::isError() const
Возвращает true, если status() == QQmlComponent::Error.
bool QQmlComponent::isLoading() const
Возвращает true, если status() == QQmlComponent::Loading.
bool QQmlComponent::isNull() const
Возвращает true, если status() == QQmlComponent::Null.
bool QQmlComponent::isReady() const
Возвращает true, если status() == QQmlComponent::Ready.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/qqmlcomponent.html