Класс QQmlIncubator
Класс QQmlIncubator позволяет создавать объекты QML асинхронно. Подробнее...
| Заголовок: | #include <QQmlIncubator> |
| qmake: | QT += qml |
Типы публичного доступа
| перечисление | IncubationMode { Асинхронно, АсинхронноПриВложенности, Синхронно } |
| перечисление | Статус { Пусто, Готово, Загрузка, Ошибка } |
Функции публичного доступа
| QQmlIncubator(QQmlIncubator::IncubationMode mode = Асинхронно) | |
| void | очистить() |
| QList<QQmlError> | ошибки() const |
| void | принудительноЗавершить() |
| QQmlIncubator::IncubationMode | режимИнкубации() const |
| bool | естьОшибка() const |
| bool | загрузка() const |
| bool | пустой() const |
| bool | готов() const |
| QObject * | объект() const |
| void | установитьНачальныеСвойства(const QVariantMap &initialProperties) |
| QQmlIncubator::Статус | статус() const |
Защищенные функции
| virtual void | установитьНачальноеСостояние(QObject *object) |
| virtual void | изменилсяСтатус(QQmlIncubator::Статус 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 для синхронного и асинхронного создания.
- Асинхронный (по умолчанию). Создание происходит асинхронно, при условии что на QQmlEngine установлен QQmlIncubatorController.
Инкубатор останется в состоянии Загрузка до тех пор, пока создание не будет завершено или не произойдет ошибка. Обратный вызов изменилсяСтатус() можно использовать для уведомления о изменениях статуса.
Приложения должны использовать режим асинхронной инкубации для создания объектов, которые не нужны немедленно. Например, тип 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::Статус
Определяет статус QQmlIncubator.
| Константа | Значение | Описание |
|---|---|---|
QQmlIncubator::Null |
0 |
Процесс инкубации не происходит. Вызовите QQmlComponent::create(), чтобы начать инкубацию. |
QQmlIncubator::Ready |
1 |
Объект полностью создан и может быть доступен через вызов объект(). |
QQmlIncubator::Loading |
2 |
Объект находится в процессе создания. |
QQmlIncubator::Error |
3 |
Произошла ошибка. Ошибки могут быть получены через вызов ошибки(). |
Документация по функциям-членам
QQmlIncubator::QQmlIncubator(QQmlIncubator::IncubationMode mode = Asynchronous)
Создать новый инкубатор с указанным режимом 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.
void QQmlIncubator::setInitialProperties(const QVariantMap &initialProperties)
Хранит отображение имен свойств к начальным значениям, содержащимся в initialProperties, с которыми будет инициализирован инкубируемый компонент.
Эта функция была добавлена в Qt 5.15.
См. также QQmlComponent::setInitialProperties.
[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.15/qqmlincubator.html