Класс 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) |
Подробное описание
Класс QQmlIncubator позволяет создавать объекты QML асинхронно.
Создание объектов 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 как для синхронного, так и для асинхронного создания.
- Асинхронный (по умолчанию) Создание происходит асинхронно, предполагая, что в QQmlEngine установлен QQmlIncubatorController.
Инкубатор будет оставаться в состоянии Загрузка, пока создание не будет завершено или не произойдёт ошибка. Обратный вызов 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 = Asynchronous)
Создать новый инкубатор с указанным режимом
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.12/qqmlincubator.html