QQmlIncubator 类

QQmlIncubator 类允许异步创建 QML 对象。 更多信息...

头文件 #include <QQmlIncubator>
CMakefind_package(Qt6 REQUIRED COMPONENTS Qml)
target_link_libraries(mytarget PRIVATE Qt6::Qml)
qmakeQT += qml

公共类型

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

公共函数

QQmlIncubator(QQmlIncubator::IncubationMode mode = Asynchronous)
voidclear()
QList<QQmlError>errors() const
voidforceCompletion()
QQmlIncubator::IncubationModeincubationMode() const
boolisError() const
boolisLoading() const
boolisNull() const
boolisReady() const
QObject *object() const
voidsetInitialProperties(const QVariantMap &initialProperties)
QQmlIncubator::Statusstatus() const

受保护函数

virtual voidsetInitialState(QObject *object)
virtual voidstatusChanged(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同步创建对象。默认情况下,没有设置孵化控制器。然而,QQuickViewQQuickWindowQQuickWidget分别在其各自的QQmlEngine上设置了孵化控制器。这些孵化控制器在视图渲染过程中将孵化分散到多个帧上。

QQmlIncubator支持三种孵化模式

  • 同步 创建操作是同步发生的。也就是说,一旦QQmlComponent::create()调用返回,孵化器就已经处于错误或就绪状态。与直接在QQmlComponent上使用同步创建方法相比,同步孵化器没有真正的优势,但它可能简化了应用程序的实现,以便可以同时使用同步和异步创建的同一API。
  • 异步(默认)如果设置了QQmlEngine上的QQmlIncubatorController,创建操作是异步发生的。

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

    应用程序应使用异步孵化模式来创建不需要立即的对象。例如,ListView类型使用异步孵化来创建在列表滚动时略显屏幕之外的对象。如果在异步创建期间需要立即可用的对象,可以调用QQmlIncubator::forceCompletion()方法来同步完成创建过程。

  • 异步如果嵌套如果创建是嵌套异步创建的一部分,则创建会异步发生,如果不是则同步发生。

    在大多数情况下,当QML组件希望有同步实例化的外观时,应使用此模式。

    这个模式最好用一个例子来解释。当类型ListView第一次创建时,它需要使用一组初始委托来填充自己以显示。如果ListView高400像素,并且每个代理高100像素,则需要创建四个初始代理实例。如果ListView使用异步孵化模式,则ListView始终是创建为空,然后在稍后,四个初始项会出现。

    相反,如果ListView使用同步孵化模式,它将能够正确显示,但这可能会导致应用程序出现卡顿。因为QML需要停止并同步实例化ListView的代理,如果ListView是异步实例化的一部分组件,这可能会取消异步实例化的许多好处。

    异步如果嵌套(AsynchronousIfNested)模式解决了这个问题。通过使用异步如果嵌套,当ListView自身已经是异步实例化的一部分时,ListView的代理将异步实例化;如果不是,将同步实例化。在嵌套异步实例化的情况下,外层异步实例化将在所有嵌套实例化完成后才完成。这确保了在外层异步实例化完成时,内层元素如ListView已经完成了初始代理的加载。

    几乎总是不正确使用同步孵化模式;那些希望有同步实例化外观但又不希望引入应用程序冻结或卡顿的元素或组件应该使用异步如果嵌套孵化模式。

成员类型文档

枚举 QQmlIncubator::IncubationMode

指定孵化器的工作模式。无论孵化模式如何,如果没有设置QQmlIncubatorQQmlEngineQQmlIncubationControllerQQmlIncubator都会以同步方式工作。

常数描述
QQmlIncubator::Asynchronous0对象将异步创建。
QQmlIncubator::AsynchronousIfNested1如果对象正在一个已包含异步创建的上下文中创建,此孵化器将加入现有的孵化,并异步执行。现有的孵化在两者都完成后才会变成Ready状态。否则,孵化会同步执行。
QQmlIncubator::Synchronous2对象将同步创建。

枚举 QQmlIncubator::Status

指定QQmlIncubator的状态。

常数描述
QQmlIncubator::Null0孵化没有进行中。调用QQmlComponent::create()开始孵化。
QQmlIncubator::Ready1对象已完全创建,可以通过调用object()访问。
QQmlIncubator::Loading2对象正在创建中。
QQmlIncubator::Error3发生错误。错误可以通过调用errors()访问。

成员函数文档

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

创建一个指定模式的新孵化器

void QQmlIncubator::clear()

清除孵化器。任何正在进行中的孵化将被终止。如果孵化器处于Ready状态,创建的对象不会删除。

QList<QQmlError> QQmlIncubator::errors() const

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

void QQmlIncubator::forceCompletion()

强制任何正在进行中的孵化异步完成。一旦这次调用返回,孵化器将不会处于加载状态。

QQmlIncubator::IncubationMode QQmlIncubator::incubationMode() const

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

bool QQmlIncubator::isError() const

如果孵化器的 status() 状态是错误,则返回 true。

bool QQmlIncubator::isLoading() const

如果孵化器的 status() 状态是加载,则返回 true。

bool QQmlIncubator::isNull() const

如果孵化器的 status() 状态是空,则返回 true。

bool QQmlIncubator::isReady() const

如果孵化器的 status() 状态是就绪,则返回 true。

QObject *QQmlIncubator::object() const

如果状态是就绪,则返回孵化对象,否则返回 0。

void QQmlIncubator::setInitialProperties(const QVariantMap &initialProperties)

initialProperties 中包含的属性名称与其初始值之间的映射存储起来,该映射用于初始化孵化组件。

另请参阅QQmlComponent::setInitialProperties.

[虚拟受保护] 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

返回孵化器的当前状态。

[虚拟受保护] void QQmlIncubator::statusChanged(QQmlIncubator::Status status)

当孵化器状态改变时调用。 status 是新状态。

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

© 2024 Qt公司有限。本文件中的文档贡献归各自所有者享有版权。提供的文档根据自由软件基金会的发布版本许可,受GNU自由文档许可证第1.3版本的条款许可。Qt及其相关标志是芬兰及其它全球国家的The Qt Company Ltd的商标。所有其他商标均为各自所有者的财产。