Класс QQmlIncubator
Класс QQmlIncubator позволяет создавать объекты QML асинхронно. Подробнее...
| Заголовок: | #include <QQmlIncubator> |
| qmake: | QT += qml |
Публичные типы
| перечисление | IncubationMode { Asynchronous, AsynchronousIfNested, Synchronous } |
| перечисление | Status { Null, Ready, Loading, Error } |
Публичные функции
| QQmlIncubator(QQmlIncubator::IncubationMode mode = Asynchronous) | |
| void | clear() |
| QList<QQmlError> | errors() const |
| void | forceCompletion() |
| QQmlIncubator::IncubationMode | incubationMode() const |
| bool | isError() const |
| bool | isLoading() const |
| bool | isNull() const |
| bool | isReady() const |
| QObject * | object() const |
| QQmlIncubator::Status | status() const |
Защищенные функции
| virtual void | setInitialState(QObject *object) |
| virtual void | statusChanged(QQmlIncubator::Status status) |
Подробное описание
Создание объектов QML — например, делегатов в представлении или новой страницы в приложении — может занимать заметное количество времени, особенно на мобильных устройствах с ограниченными ресурсами. Когда приложение использует QQmlComponent::create() напрямую, экземпляр объекта QML создаётся синхронно, что, в зависимости от сложности объекта, может привести к заметным паузам или подтормаживанию в приложении.
Использование QQmlIncubator даёт больший контроль над созданием объекта QML, включая возможность его асинхронного создания с использованием свободного времени приложения. Следующий пример демонстрирует простое использование QQmlIncubator.
QQmlIncubator incubator;
component->create(incubator);
while (!incubator.isReady()) {
QCoreApplication::processEvents(QEventLoop::AllEvents, 50);
}
QObject *object = incubator.object(); Асинхронные инкубаторы контролируются QQmlIncubationController, который устанавливается на QQmlEngine, позволяя движку знать, когда приложение находится в состоянии ожидания, и объекты должны обрабатываться во время инкубации. Если контроллер инкубации не установлен на QQmlEngine, QQmlIncubator создаёт объекты синхронно независимо от указанного IncubationMode.
QQmlIncubator поддерживает три режима инкубации:
- Синхронный. Создание происходит синхронно. То есть, как только вызов QQmlComponent::create() возвращает значение, инкубатор уже будет в состоянии Error или Ready. У синхронного инкубатора нет реального преимущества по сравнению с использованием прямых синхронных методов создания на QQmlComponent, но это может упростить реализацию приложения при использовании одного API для синхронного и асинхронного создания.
- Асинхронный (по умолчанию). Создание происходит асинхронно, предполагая, что на QQmlEngine установлен QQmlIncubatorController.
Инкубатор останется в состоянии Loading до тех пор, пока создание не будет завершено или не произойдёт ошибка. Обратный вызов statusChanged() можно использовать для получения уведомлений об изменениях состояния.
Приложения должны использовать асинхронный режим инкубации для создания объектов, которые не нужны немедленно. Например, тип ListView использует асинхронную инкубацию для создания объектов, которые немного находятся вне экрана во время прокрутки списка. Если во время асинхронного создания объект нужен немедленно, можно вызвать метод QQmlIncubator::forceCompletion() для завершения процесса создания синхронно.
-
AsynchronousIfNested. Создание будет происходить асинхронно, если оно является частью вложенного асинхронного создания, или синхронно, если нет.
В большинстве сценариев, где QML-компонент требует внешнего вида синхронной инициализации, следует использовать этот режим.
Этот режим лучше всего объяснить на примере. Когда тип ListView создаётся впервые, ему необходимо заполнить себя начальным набором делегатов для отображения. Если ListView имел высоту 400 пикселей, а каждый делегат — 100 пикселей, ему потребовалось бы создать четыре начальных экземпляра делегатов. Если ListView использовал асинхронный режим инкубации, ListView всегда создавался бы пустым, а затем, некоторое время спустя, появлялись бы четыре начальных элемента.
Напротив, если бы ListView использовал синхронный режим инкубации, он бы работал правильно, но это может привести к подтормаживанию в приложении. Поскольку QML должен был бы остановиться и синхронно инициализировать делегаты ListView, если бы ListView был частью QML-компонента, который инициализировался асинхронно, это аннулировало бы большую часть преимуществ асинхронной инициализации.
AsynchronousIfNested режим согласует эту проблему. Используя AsynchronousIfNested, делегаты ListView инициализируются асинхронно, если сам ListView уже является частью асинхронной инициализации, и синхронно в противном случае. В случае вложенной асинхронной инициализации внешняя асинхронная инициализация не завершится до тех пор, пока не завершатся все вложенные инициализации. Это гарантирует, что к моменту завершения внешней асинхронной инициализации внутренние элементы, такие как ListView, уже завершили загрузку своих начальных делегатов.
Почти всегда неправильно использовать синхронный режим инкубации - элементы или компоненты, которые хотят внешнего вида синхронной инициализации, но без недостатков введения зависаний или подтормаживаний в приложении, должны использовать режим инкубации AsynchronousIfNested.
Документация по типам членов
перечисление QQmlIncubator::IncubationMode
Указывает режим работы инкубатора. Независимо от режима инкубации, QQmlIncubator будет вести себя синхронно, если на QQmlEngine не установлен QQmlIncubationController.
| Постоянная | Значение | Описание |
|---|---|---|
QQmlIncubator::Asynchronous |
0 |
Объект будет создан асинхронно. |
QQmlIncubator::AsynchronousIfNested |
1 |
Если объект создаётся в контексте, который уже является частью асинхронного создания, этот инкубатор присоединится к этому существующему процессу инкубации и выполнится асинхронно. Существующая инкубация не станет Ready, пока не завершатся как она, так и эта инкубация. В противном случае инкубация выполнится синхронно. |
QQmlIncubator::Synchronous |
2 |
Объект будет создан синхронно. |
перечисление QQmlIncubator::Status
Указывает состояние QQmlIncubator.
| Постоянная | Значение | Описание |
|---|---|---|
QQmlIncubator::Null |
0 |
Инкубация не выполняется. Вызовите QQmlComponent::create() для начала инкубации. |
QQmlIncubator::Ready |
1 |
Объект полностью создан и может быть доступен с помощью вызова object(). |
QQmlIncubator::Loading |
2 |
Объект находится в процессе создания. |
QQmlIncubator::Error |
3 |
Произошла ошибка. Ошибки можно получить, вызвав errors(). |
Документация по функциям членов
QQmlIncubator::QQmlIncubator(QQmlIncubator::IncubationMode mode = Asynchronous)
Создать новый инкубатор с указанным режимом mode
void QQmlIncubator::clear()
Очищает инкубатор. Любая текущая инкубация прерывается. Если инкубатор находится в состоянии Ready, созданный объект не удаляется.
QList<QQmlError> QQmlIncubator::errors() const
Возвращает список ошибок, возникших при инкубации объекта.
void QQmlIncubator::forceCompletion()
Принудительно завершить любую текущую инкубацию синхронно. После возврата этого вызова инкубатор больше не будет находиться в состоянии Loading.
QQmlIncubator::IncubationMode QQmlIncubator::incubationMode() const
Возвращает режим инкубации, переданный конструктору QQmlIncubator.
bool QQmlIncubator::isError() const
Возвращает true, если состояние инкубатора status() равно Error.
bool QQmlIncubator::isLoading() const
Возвращает true, если состояние инкубатора status() равно Loading.
bool QQmlIncubator::isNull() const
Возвращает true, если состояние инкубатора status() равно Null.
bool QQmlIncubator::isReady() const
Возвращает true, если состояние инкубатора status() равно Ready.
QObject *QQmlIncubator::object() const
Возвращает инкубированный объект, если состояние равно Ready, в противном случае 0.
[virtual protected] void QQmlIncubator::setInitialState(QObject *object)
Вызывается после первого создания объекта object, но до вычисления связей свойств и, при необходимости, вызова QQmlParserStatus::componentComplete(). Это эквивалентно моменту между QQmlComponent::beginCreate() и QQmlComponent::completeCreate(), и может использоваться для задания начальных значений свойств объекта.
По умолчанию ничего не делает.
QQmlIncubator::Status QQmlIncubator::status() const
Возвращает текущее состояние инкубатора.
[virtual protected] void QQmlIncubator::statusChanged(QQmlIncubator::Status status)
Вызывается при изменении состояния инкубатора. status — новое состояние.
По умолчанию ничего не делает.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.13/qqmlincubator.html