Spec-Zone.ru › Qt 5.6

Класс QQmlIncubator

Класс QQmlIncubator позволяет создавать объекты QML асинхронно. Подробнее...

Заголовок: #include <QQmlIncubator>
qmake: QT += qml
  • Список всех членов, включая унаследованные

Типы публичного доступа

Перечисление РежимИнкубации { Асинхронно, АсинхронноЕслиВложенно, Синхронно }
Перечисление Состояние { Нулевое, Готово, Загрузка, Ошибка }

Функции публичного доступа

QQmlIncubator(РежимИнкубации режим = Асинхронно)
void очистить()
QList<QQmlError> ошибки() const
void принудительноЗавершить()
РежимИнкубации режимИнкубации() const
bool естьОшибка() const
bool загрузка() const
bool нулевой() const
bool готов() const
QObject * объект() const
Состояние состояние() const

Защищённые функции

virtual void установитьНачальноеСостояние(QObject *объект)
virtual void изменилосьСостояние(Состояние состояние)

Подробное описание

Класс 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 создаёт объекты синхронно независимо от указанного РежимаИнкубации.

QQmlIncubator поддерживает три режима инкубации:

  • Синхронно. Создание происходит синхронно. То есть, как только вызов QQmlComponent::create() возвращает значение, инкубатор уже находится в состоянии «Ошибка» или «Готово». Синхронный инкубатор не имеет реального преимущества по сравнению с использованием синхронных методов создания на QQmlComponent напрямую, но он может упростить реализацию приложения для использования одного API для синхронного и асинхронного создания.
  • Асинхронно (по умолчанию). Создание происходит асинхронно, при условии, что на QQmlEngine установлен QQmlIncubatorController.

    Инкубатор останется в состоянии «Загрузка», пока создание не будет завершено или не произойдёт ошибка. Обратный вызов изменилосьСостояние() можно использовать для уведомления о изменениях состояния.

    Приложения должны использовать режим асинхронной инкубации для создания объектов, которые не нужны немедленно. Например, тип ListView использует асинхронную инкубацию для создания объектов, которые находятся немного вне экрана во время прокрутки списка. Если во время асинхронного создания объект необходим немедленно, можно вызвать метод QQmlIncubator::forceCompletion() для синхронного завершения процесса создания.

  • АсинхронноЕслиВложенно. Создание будет происходить асинхронно, если оно является частью вложенного асинхронного создания, или синхронно, если нет.

    В большинстве сценариев, где QML-компонент хочет обеспечить видимость синхронной инициализации, он должен использовать этот режим.

    Этот режим лучше всего объяснять на примере. Когда впервые создаётся тип ListView, он должен заполнить себя начальным набором делегатов, чтобы показать. Если ListView имел высоту 400 пикселей, а каждый делегат имел высоту 100 пикселей, ему нужно было бы создать четыре начальных экземпляра делегатов. Если ListView использовал режим асинхронной инкубации, ListView всегда создавался бы пустым, а затем, через некоторое время, появлялись бы четыре начальных элемента.

    Если бы ListView использовал режим синхронной инкубации, он работал бы правильно, но это может привести к задержкам в работе приложения. QML должен был бы остановиться и синхронно инициализировать делегаты ListView, если бы ListView был частью QML-компонента, который инициализировался асинхронно, это свело бы на нет большую часть преимуществ асинхронной инициализации.

    Режим АсинхронноЕслиВложенно согласует эту проблему. Используя режим АсинхронноЕслиВложенно, делегаты ListView инициализируются асинхронно, если сам ListView уже является частью асинхронной инициализации, и синхронно в противном случае. В случае вложенной асинхронной инициализации внешняя асинхронная инициализация не завершится до тех пор, пока не завершатся все вложенные инициализации. Это гарантирует, что к моменту завершения внешней асинхронной инициализации внутренние элементы, такие как ListView, уже завершат загрузку своих начальных делегатов.

    Практически всегда неверно использовать режим синхронной инкубации — элементы или компоненты, которые хотят обеспечить видимость синхронной инициализации, но без недостатков, связанных с введением задержек или рывков в работе приложения, должны использовать режим инкубации АсинхронноЕслиВложенно.

Документация по типам членов

Перечисление QQmlIncubator::РежимИнкубации

Определяет режим работы инкубатора. Независимо от режима инкубации, QQmlIncubator будет вести себя синхронно, если на QQmlEngine не установлен QQmlIncubationController.

Константа Значение Описание
QQmlIncubator::Asynchronous 0 Объект будет создан асинхронно.
QQmlIncubator::AsynchronousIfNested 1 Если объект создаётся в контексте, который уже является частью асинхронного создания, этот инкубатор присоединится к существующей инкубации и выполнится асинхронно. Существующая инкубация не станет «Готово», пока не завершатся как она, так и эта инкубация. В противном случае инкубация выполнится синхронно.
QQmlIncubator::Synchronous 2 Объект будет создан синхронно.

Перечисление QQmlIncubator::Состояние

Определяет состояние QQmlIncubator.

Константа Значение Описание
QQmlIncubator::Null 0 Инкубация не выполняется. Вызовите QQmlComponent::create() для начала инкубации.
QQmlIncubator::Ready 1 Объект полностью создан и доступен для доступа с помощью вызова объект().
QQmlIncubator::Loading 2 Объект находится в процессе создания.
QQmlIncubator::Error 3 Произошла ошибка. К ошибкам можно получить доступ с помощью вызова ошибки().

Документация по функциям членов

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/archives/qt-5.6/qqmlincubator.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API