Spec-Zone.ru › Qt 5.11

Класс 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 для синхронного и асинхронного создания.
  • Асинхронный (по умолчанию) Создание происходит асинхронно, при условии, что QQmlIncubationController установлен на 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 = 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/archives/qt-5.11/qqmlincubator.html

Spec-Zone.ru

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