Класс QQmlIncubator
Класс QQmlIncubator позволяет создавать объекты QML асинхронно. Подробнее...
| Заголовок: | #include <QQmlIncubator> |
| qmake: | QT += qml |
Типы
| перечисление | IncubationMode { Асинхронный, АсинхронныйПриВложенности, Синхронный } |
| перечисление | Status { Пустой, Готов, Загрузка, Ошибка } |
Общедоступные функции
| QQmlIncubator(IncubationMode mode = Асинхронный) | |
| void | clear() |
| QList<QQmlError> | errors() const |
| void | forceCompletion() |
| IncubationMode | incubationMode() const |
| bool | isError() const |
| bool | isLoading() const |
| bool | isNull() const |
| bool | isReady() const |
| QObject * | object() const |
| Status | status() const |
Защищенные функции
| virtual void | setInitialState(QObject *object) |
| virtual void | statusChanged(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 как для синхронного, так и для асинхронного создания.
- Асинхронный (по умолчанию). Создание происходит асинхронно, предполагая, что 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(IncubationMode mode = Asynchronous)
Создать новый инкубатор с указанным режимом
void QQmlIncubator::clear()
Очищает инкубатор. Любая выполняемая инкубация прерывается. Если инкубатор находится в состоянии Готово, созданный объект не удаляется.
QList<QQmlError> QQmlIncubator::errors() const
Возвращает список ошибок, возникших при инкубации объекта.
void QQmlIncubator::forceCompletion()
Принудительно завершить любую выполняемую инкубацию синхронно. После возврата этого вызова инкубатор больше не будет находиться в состоянии Загрузка.
IncubationMode QQmlIncubator::incubationMode() const
Возвращает режим инкубации, переданный конструктору QQmlIncubator.
bool QQmlIncubator::isError() const
Возвращает true, если состояние инкубатора status() равно Ошибка.
bool QQmlIncubator::isLoading() const
Возвращает true, если состояние инкубатора status() равно Загрузка.
bool QQmlIncubator::isNull() const
Возвращает true, если состояние инкубатора status() равно Пусто.
bool QQmlIncubator::isReady() const
Возвращает true, если состояние инкубатора status() равно Готово.
QObject *QQmlIncubator::object() const
Возвращает инкубируемый объект, если состояние равно Готово, иначе 0.
[virtual protected] void QQmlIncubator::setInitialState(QObject *object)
Вызывается после того, как object был создан впервые, но перед оценкой привязок свойств и, применительно, вызовом QQmlParserStatus::componentComplete(). Это эквивалентно моменту между QQmlComponent::beginCreate() и QQmlComponent::completeCreate(), и может быть использовано для присвоения начальных значений свойствам объекта.
По умолчанию ничего не делает.
Status QQmlIncubator::status() const
Возвращает текущее состояние инкубатора.
[virtual protected] void QQmlIncubator::statusChanged(Status status)
Вызывается при изменении состояния инкубатора. status — новое состояние.
По умолчанию ничего не делает.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.9/qqmlincubator.html