Класс QQmlIncubator
Класс QQmlIncubator позволяет создавать объекты QML асинхронно. Подробнее...
| Заголовок: | #include <QQmlIncubator> |
| qmake: | QT += qml |
Типы публичного доступа
| перечисление | IncubationMode { Асинхронно, АсинхронноЕслиВложенный, Синхронно } |
| перечисление | Status { Пусто, Готово, Загрузка, Ошибка } |
Функции публичного доступа
| QQmlIncubator(QQmlIncubator::IncubationMode mode = Асинхронно) | |
| 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() возвращает результат, инкубатор уже находится в состоянии Ошибка или Готово. Синхронный инкубатор не имеет реальных преимуществ по сравнению с использованием синхронных методов создания в QQmlComponent напрямую, но может упростить реализацию приложения при использовании одного API для синхронного и асинхронного создания.
- Асинхронный (по умолчанию). Создание происходит асинхронно, предполагая, что QQmlIncubatorController установлен в QQmlEngine.
Инкубатор останется в состоянии Загрузка до тех пор, пока создание не будет завершено или не произойдёт ошибка. Обратный вызов statusChanged() можно использовать для получения уведомлений о изменениях состояния.
Приложения должны использовать режим асинхронной инкубации для создания объектов, которые не нужны немедленно. Например, тип ListView использует асинхронную инкубацию для создания объектов, которые немного находятся за пределами экрана, в то время как список прокручивается. Если во время асинхронного создания объект нужен немедленно, можно вызвать метод QQmlIncubator::forceCompletion() для синхронного завершения процесса создания.
-
АсинхронноЕслиВложенный. Создание происходит асинхронно, если это часть вложенного асинхронного создания, или синхронно, если нет.
В большинстве сценариев, где QML-компонент хочет имитировать синхронное создание, он должен использовать этот режим.
Этот режим лучше всего объясняется на примере. Когда тип ListView создаётся впервые, ему необходимо заполнить себя начальным набором делегатов для отображения. Если ListView имеет высоту 400 пикселей, а каждый делегат — 100 пикселей, ему нужно создать четыре начальных экземпляра делегатов. Если ListView использовал режим асинхронной инкубации, ListView всегда будет создаваться пустым, а затем, в какой-то момент позже, появятся четыре начальных элемента.
В свою очередь, если ListView использовал бы синхронный режим инкубации, он бы вёл себя правильно, но это может ввести подтормаживания в приложение. QML должен был бы остановиться и синхронно создать делегатов ListView, если ListView был частью QML-компонента, который создавался асинхронно, это аннулировало бы большую часть преимущества асинхронного создания.
Режим АсинхронноЕслиВложенный примиряет эту проблему. Используя АсинхронноЕслиВложенный, делегаты ListView создаются асинхронно, если сам ListView уже является частью асинхронного создания, и синхронно в противном случае. В случае вложенного асинхронного создания внешнее асинхронное создание не завершится до тех пор, пока не будут завершены все вложенные создания. Это гарантирует, что к моменту завершения внешнего асинхронного создания внутренние элементы, такие как ListView, уже загрузили свои начальные делегаты.
Почти всегда неправильно использовать синхронный режим инкубации — элементы или компоненты, которые хотят имитации синхронного создания, но без недостатков ввода задержек или подтормаживаний в приложении, должны использовать режим инкубации АсинхронноЕслиВложенный.
Документация типов членов
перечисление QQmlIncubator::IncubationMode
Определяет режим работы инкубатора. Независимо от режима инкубации, QQmlIncubator будет вести себя синхронно, если в QQmlEngine не задан QQmlIncubationController.
| Константа | Значение | Описание |
|---|---|---|
QQmlIncubator::Asynchronous |
0 |
Объект будет создан асинхронно. |
QQmlIncubator::AsynchronousIfNested |
1 |
Если объект создаётся в контексте, который уже является частью асинхронного создания, этот инкубатор присоединится к этому существующему процессу инкубации и будет выполняться асинхронно. Существующее создание не станет Готовым, пока не завершатся оба процесса — и это создание, и текущее. В противном случае инкубация будет выполняться синхронно. |
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 = Асинхронно)
Создаёт новый инкубатор с указанным режимом 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.14/qqmlincubator.html