本页内容

QQmlIncubator Class

QQmlIncubator 类允许异步创建 QML 对象。更多内容...

标题: #include <QQmlIncubator>
CMake: find_package(Qt6 REQUIRED COMPONENTS Qml)
target_link_libraries(mytarget PRIVATE Qt6::Qml)
qmake: QT += qml

公共类型

enum IncubationMode { Asynchronous, AsynchronousIfNested, Synchronous }
enum Status { Null, Ready, Loading, Error }

公共函数

QQmlIncubator(QQmlIncubator::IncubationMode mode = Asynchronous)
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
void setInitialProperties(const QVariantMap &initialProperties)
QQmlIncubator::Status status() const

受保护函数

virtual void setInitialState(QObject *object)
virtual void statusChanged(QQmlIncubator::Status status)

详细说明

创建 QML 对象(例如视图中的代理或应用程序中的新页面)可能需要相当长的时间,尤其是在资源受限的移动设备上。当应用程序直接使用 `QQmlComponent::create()` 时,QML 对象实例会以同步方式创建,这可能会根据对象的复杂程度,导致应用程序出现明显的停顿或卡顿。

使用 QQmlIncubator 可以更好地控制 QML 对象的创建过程,包括利用应用程序的空闲时间异步创建对象。以下示例展示了 QQmlIncubator 的简单用法。

// Initialize the incubator
QQmlIncubator incubator;
component->create(incubator);

让孵化器运行一段时间(通常通过将控制权交还给事件循环),然后对其进行轮询。稍后返回孵化器有多种方法。您可以连接到QQuickWindow 发送的某个信号,或者专门为此运行一个QTimer 。 您可能还需要该对象来实现某些特定目的,并在需要时轮询孵化器。

// Poll the incubator
if (incubator.isReady()) {
    QObject *object = incubator.object();
    // Use created object
}

异步孵化器由设置在QQmlEngine 上的QQmlIncubationController 控制,该信号让引擎知道应用程序何时处于空闲状态,以及何时应处理待孵化的对象。 如果未在QQmlEngine 上设置孵化控制器,则QQmlIncubator 会同步创建对象,无论指定的IncubationMode 为何。默认情况下,未设置任何孵化控制器。但是,QQuickView 、QQuickWindow 和QQuickWidget 都会在其各自的QQmlEngine上设置孵化控制器。这些孵化控制器会在视图渲染期间将孵化操作分散到多个帧中进行。

QQmlIncubator 支持三种孵化模式:

  • 同步 创建操作以同步方式进行。也就是说,一旦调用QQmlComponent::create()返回,孵化器将立即处于“错误”或“就绪”状态。 与直接在QQmlComponent 上使用同步创建方法相比,同步孵化器并没有真正的优势,但使用相同的API同时处理同步和异步创建,可能会简化应用程序的实现。
  • 异步(默认) 假设已在QQmlEngine 上设置了 QQmlIncubatorController,则创建过程将异步进行。

    该孵化器将保持在“加载”状态,直到创建完成或发生错误为止。可以使用statusChanged() 回调来接收状态变化的通知。

    应用程序应使用“异步”孵化模式来创建无需立即使用的对象。例如,ListView 类型在滚动列表时,会使用“异步”孵化来创建那些暂时不在屏幕上的对象。如果在异步创建过程中需要立即使用该对象,可以调用QQmlIncubator::forceCompletion()方法以同步完成创建过程。

  • AsynchronousIfNested 如果属于嵌套的异步创建过程的一部分,则创建将异步进行;否则将同步进行。

    在大多数需要 QML 组件呈现出同步实例化效果的场景中,应使用此模式。

    通过一个示例可以最好地解释这种模式。当首次创建ListView 类型时,它需要填充一组初始的委托对象以进行显示。 如果ListView 的高度为400像素,而每个delegate的高度为100像素,则需要创建四个初始的delegate实例。如果ListView 使用了异步孵化模式,那么ListView 将始终以空状态创建,然后在稍后某个时间点,这四个初始项目才会出现。

    反之,如果ListView 采用“同步孵化”模式,虽然行为正确,但可能会导致应用程序出现卡顿。 由于 QML 必须暂停并同步实例化ListView 的委托,如果ListView 属于一个正在异步实例化的 QML 组件,这将抵消异步实例化的大部分优势。

    AsynchronousIfNested 模式解决了这一问题。通过使用AsynchronousIfNested ,当ListView 本身已是异步实例化的一部分时,ListView 的委托将异步实例化;否则则同步实例化。 在嵌套的异步实例化情况下,外层异步实例化要等到所有嵌套实例化都完成后才会结束。这确保了当外层异步实例化完成时,诸如ListView 之类的内部项已经完成了其初始委托的加载。

    使用“同步”(Synchronous)孵化模式几乎总是错误的——那些希望呈现同步实例化效果,但又不想给应用程序带来卡顿或停滞等弊端的元素或组件,应使用“渐进式”(AsynchronousIfNested )孵化模式。

成员类型文档

enum QQmlIncubator::IncubationMode

指定培养箱的工作模式。无论采用何种培养模式,如果QQmlEngine 未设置QQmlIncubationController ,则QQmlIncubator 将以同步方式运行。

常量值描述
QQmlIncubator::Asynchronous0该对象将异步创建。
QQmlIncubator::AsynchronousIfNested1如果对象是在已经属于异步创建过程的上下文中创建的,则该孵化器将加入现有的孵化过程并异步执行。只有当现有孵化过程和本次孵化过程都完成后,现有孵化过程才会进入“就绪”状态。否则,孵化过程将同步执行。
QQmlIncubator::Synchronous2该对象将以同步方式创建。

enum QQmlIncubator::Status

指定QQmlIncubator 的状态。

常量值描述
QQmlIncubator::Null0孵化尚未进行。调用QQmlComponent::create() 开始孵化。
QQmlIncubator::Ready1对象已完全创建,可通过调用object() 访问该对象。
QQmlIncubator::Loading2该对象正在创建中。
QQmlIncubator::Error3发生错误。可通过调用errors() 获取错误信息。

成员函数文档

QQmlIncubator::QQmlIncubator(QQmlIncubator::IncubationMode mode = Asynchronous)

使用指定的参数创建一个新的孵化器mode

void QQmlIncubator::clear()

清空孵化器。任何正在进行的孵化操作都会被中止。如果孵化器处于“就绪”状态,则已创建的对象不会被删除。

QList<QQmlError> QQmlIncubator::errors() const

返回在孵化该对象时遇到的错误列表。

void QQmlIncubator::forceCompletion()

强制所有正在进行的孵化任务同步完成。此调用返回后,孵化器将不再处于“加载中”状态。

QQmlIncubator::IncubationMode QQmlIncubator::incubationMode() const

返回传递给QQmlIncubator 构造函数的孵化模式。

bool QQmlIncubator::isError() const

如果孵化器的status()返回Error,则返回true。

bool QQmlIncubator::isLoading() const

如果孵化器的status()状态为“加载中”,则返回true。

bool QQmlIncubator::isNull() const

如果孵化器的status() 为 Null,则返回 true。

bool QQmlIncubator::isReady() const

如果孵化器的status() 处于“就绪”状态,则返回 true。

QObject *QQmlIncubator::object() const

如果状态为“Ready”,则返回该孵化对象;否则返回 0。

void QQmlIncubator::setInitialProperties(const QVariantMap &initialProperties)

存储一个从属性名称到初始值的映射,该映射包含在initialProperties 中,孵化组件将使用该映射进行初始化。

另请参阅 QQmlComponent::setInitialProperties 。

[virtual protected] void QQmlIncubator::setInitialState(QObject *object)

在object 首次创建后,但在评估复杂属性绑定以及(如适用)调用QQmlParserStatus::componentComplete()之前调用此方法。这相当于QQmlComponent::beginCreate()与QQmlComponent::completeCreate()之间的时机,可用于为对象的属性赋初始值。

默认实现不执行任何操作。

注意: 诸如数值字面量之类的简单 绑定会在调用 setInitialState() 之前进行求值。 将绑定分为简单绑定和复杂绑定的分类是故意未作规定的,并且可能会在不同的 Qt 版本之间发生变化,还取决于您是否以及如何使用qmlcachegen。您不应依赖任何特定的绑定在调用 setInitialState() 之前或之后被求值。 例如,像MyType.EnumValue这样的常量表达式可能会在编译时被识别为常量,也可能被推迟执行,作为绑定处理。对于像-(5)或"a" + " constant string" 这样的常量表达式,情况也是如此。

QQmlIncubator::Status QQmlIncubator::status() const

返回孵化器的当前状态。

[virtual protected] void QQmlIncubator::statusChanged(QQmlIncubator::Status status)

当孵化器的状态发生变化时调用此方法。status 表示新的状态。

默认实现不执行任何操作。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.