QQmlComponent 类

QQmlComponent 类封装了 QML 组件的定义。 更多信息...

头文件 #include <QQmlComponent>
CMakefind_package(Qt6 REQUIRED COMPONENTS Qml)
target_link_libraries(mytarget PRIVATE Qt6::Qml)
qmakeQT += qml
由以下对象实例化 组件
继承自 QObject

公共类型

枚举CompilationMode { PreferSynchronous, Asynchronous }
枚举Status { Null, Ready, Loading, Error }

属性

公共函数

QQmlComponent(QQmlEngine *engine, QObject *parent = nullptr)
QQmlComponent(QQmlEngine *engine, const QString &fileName, QObject *parent = nullptr)
QQmlComponent(QQmlEngine *engine, const QString &fileName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)
QQmlComponent(QQmlEngine *engine, const QUrl &url, QObject *parent = nullptr)
QQmlComponent(QQmlEngine *engine, const QUrl &url, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)
(自 6.5) QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QObject *parent = nullptr)
(自 6.5) QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)
virtual~QQmlComponent() override
virtual QObject *beginCreate(QQmlContext *context)
virtual voidcompleteCreate()
virtual QObject *create(QQmlContext *context = nullptr)
voidcreate(QQmlIncubator &incubator, QQmlContext *context = nullptr, QQmlContext *forContext = nullptr)
QObject *createWithInitialProperties(const QVariantMap &initialProperties, QQmlContext *context = nullptr)
QQmlContext *creationContext() const
QQmlEngine *engine() const
QList<QQmlError>errors() const
(自6.5起) boolisBound() const
boolisError() const
boolisLoading() const
boolisNull() const
boolisReady() const
qrealprogress() const
voidsetInitialProperties(QObject *component, const QVariantMap &properties)
QQmlComponent::Statusstatus() const
QUrlurl() const

公共插槽

(自6.5起) voidloadFromModule(QAnyStringView uri, QAnyStringView typeName, QQmlComponent::CompilationMode mode = PreferSynchronous)
voidloadUrl(const QUrl &url)
voidloadUrl(const QUrl &url, QQmlComponent::CompilationMode mode)
voidsetData(const QByteArray &data, const QUrl &url)

信号

voidprogressChanged(qreal progress)
voidstatusChanged(QQmlComponent::Status status)

详细描述

组件是可重用的、封装良好的QML类型,具有明确的接口。

可以从QML文件创建QQmlComponent实例。例如,如果有一个这样的main.qml文件

import QtQuick 2.0

Item {
    width: 200
    height: 200
}

以下代码将此QML文件作为组件加载,使用create()创建此组件的实例,然后查询Itemwidth

QQmlEngine *engine = new QQmlEngine;
QQmlComponent component(engine, QUrl::fromLocalFile("main.qml"));

QObject *myObject = component.create();
QQuickItem *item = qobject_cast<QQuickItem*>(myObject);
int width = item->width();  // width = 200

如果在代码中创建了组件实例,但不适用QQmlEngine实例,可以使用qmlContext()或qmlEngine()。例如,在下面的场景中,子项是在QQuickItem子类中创建的

void MyCppItem::init()
{
    QQmlEngine *engine = qmlEngine(this);
    // Or:
    // QQmlEngine *engine = qmlContext(this)->engine();
    QQmlComponent component(engine, QUrl::fromLocalFile("MyItem.qml"));
    QQuickItem *childItem = qobject_cast<QQuickItem*>(component.create());
    childItem->setParentItem(this);
}

注意,当在QObject子类的构造函数中调用这些函数时,将返回null,因为实例尚未有上下文或引擎。

网络组件

如果传给QQmlComponent的URL是网络资源,或者如果QML文档引用了网络资源,QQmlComponent必须在能够创建对象之前从网络获取数据。在这种情况下,QQmlComponent将有一个Loading 状态。必须在组件Ready后,才调用QQmlComponent::create()。

以下示例展示了如何从网络资源加载QML文件。创建QQmlComponent后,它测试组件是否正在加载。如果是,它连接到QQmlComponent::statusChanged()信号;否则直接调用continueLoading()方法。注意,如果组件已被缓存并立即准备好,网络组件的QQmlComponent::isLoading()可能为假。

MyApplication::MyApplication()
{
    // ...
    component = new QQmlComponent(engine, QUrl("http://www.example.com/main.qml"));
    if (component->isLoading()) {
        QObject::connect(component, &QQmlComponent::statusChanged,
                         this, &MyApplication::continueLoading);
    } else {
        continueLoading();
    }
}

void MyApplication::continueLoading()
{
    if (component->isError()) {
        qWarning() << component->errors();
    } else {
        QObject *myObject = component->create();
    }
}

成员类型文档

枚举 QQmlComponent::CompilationMode

指定QQmlComponent是否应立即或异步加载组件。

常量描述
QQmlComponent::PreferSynchronous0建议立即加载/编译组件,阻塞线程。这并不总是可能的;例如,远程URL总是会异步加载。
QQmlComponent::Asynchronous1在后台线程加载/编译组件。

枚举 QQmlComponent::状态

指定 QQmlComponent 的加载状态。

常量描述
QQmlComponent::Null0QQmlComponent 没有数据。调用 loadUrl() 或 setData() 添加 QML 内容。
QQmlComponent::Ready1QQmlComponent 已准备好,可调用 create()。
QQmlComponent::Loading2QQmlComponent 正在加载网络数据。
QQmlComponent::Error3发生错误。调用 errors() 获取错误列表。

属性文档

[只读] progress : const qreal

组件加载进度,从 0.0(未加载)到 1.0(完成)。

访问函数

qrealprogress() const

通知信号

voidprogressChanged(qreal progress)

[只读] status : const 状态

组件的当前 状态

访问函数

QQmlComponent::Statusstatus() const

通知信号

voidstatusChanged(QQmlComponent::Status status)

[只读] url : const QUrl

组件的 URL。这是传递给构造函数、loadUrl() 或 setData() 方法的 URL。

访问函数

QUrlurl() const

成员函数文档

QQmlComponent::QQmlComponent(QQmlEngine *engine, QObject *parent = nullptr)

创建一个无数据的 QQmlComponent,并赋予它指定的 engineparent。使用 setData() 设置数据。

QQmlComponent::QQmlComponent(QQmlEngine *engine, const QString &fileName, QObject *parent = nullptr)

从给定的 fileName 创建 QQmlComponent,并赋予它指定的 parentengine

另请参阅loadUrl

QQmlComponent::QQmlComponent(QQmlEngine *engine, const QString &fileName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)

根据给定的fileName创建QQmlComponent,并赋给它指定的parentengine。如果mode异步,该组件将会异步加载和编译。

另请参阅loadUrl

QQmlComponent::QQmlComponent(QQmlEngine *engine, const QUrl &url, QObject *parent = nullptr)

根据给定的url创建QQmlComponent,并赋给它指定的parentengine

确保提供的URL是完整且正确的,特别是在从本地文件系统加载文件时,请使用QUrl::fromLocalFile()。

相对路径将与QQmlEngine::baseUrl进行解析,除非指定,否则是当前工作目录。

另请参阅loadUrl

QQmlComponent::QQmlComponent(QQmlEngine *engine, const QUrl &url, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)

根据给定的url创建QQmlComponent,并赋给它指定的parentengine。如果mode异步,该组件将会异步加载和编译。

确保提供的URL是完整且正确的,特别是在从本地文件系统加载文件时,请使用QUrl::fromLocalFile()。

相对路径将与QQmlEngine::baseUrl进行解析,除非指定,否则是当前工作目录。

另请参阅loadUrl

[显式,自6.5版本开始] QQmlComponent::QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QObject *parent = nullptr)

从给定的uritypeName创建QQmlComponent,并给它指定的parentengine。如果可能,组件将同步加载。

这是一个重载函数。

此函数在Qt 6.5版本中引入。

另请参阅loadFromModule

[显式,自6.5版本开始] QQmlComponent::QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)

从给定的uritypeName创建QQmlComponent,并给它指定的parentengine。如果mode异步,该组件将会异步加载和编译。

这是一个重载函数。

此函数在Qt 6.5版本中引入。

另请参阅loadFromModule

[重载虚析构函数,异常不抛出] QQmlComponent::~QQmlComponent()

销毁QQmlComponent对象。

[虚拟] QObject *QQmlComponent::beginCreate(QQmlContext *context)

在此组件的指定context中创建一个对象实例。如果创建失败,则返回nullptr

注意:此方法提供了对组件实例创建的高级控制。通常,程序员应使用QQmlComponent::create()来创建对象实例。

QQmlComponent构建一个实例时,它包含三个步骤:

  1. 创建对象层次结构,并分配常量值。
  2. 首次评估属性绑定。
  3. 如果适用,将在对象上调用QQmlParserStatus::componentComplete ()。

QQmlComponent::beginCreate () 与QQmlComponent::create () 不同,因为它只执行步骤 1。必须调用 QQmlComponent::completeCreate () 来完成步骤 2 和 3。

当使用附加属性将信息传递给实例化的组件时,这个断点有时很有用,因为它允许在属性绑定生效之前配置它们的初始值。

返回的对象实例的所有权传递给调用者。

注意:将绑定分类为常量值和实际绑定是有意不明确的,并且可能会在 Qt 的不同版本之间以及在您是否和如何使用 qmlcachegen 的情况下变化。您不应该依赖在任何特定的绑定在 beginCreate() 返回之前或之后进行评估。例如,常量表达式 MyType.EnumValue 可能会在编译时识别为常数,也可能被延迟到作为绑定来执行。对于常量表达式如 -(5)"a" + " constant string" 也是同样如此。

另请参阅:completeCreate () 和 QQmlEngine::ObjectOwnership

[virtual] void QQmlComponent::completeCreate()

此方法提供了对组件实例创建的高级控制。通常,程序员应使用 QQmlComponent::create () 来创建组件。

此函数完成使用 QQmlComponent::beginCreate () 开始的组件创建,必须在之后调用。

另请参阅:beginCreate ()。

[virtual] QObject *QQmlComponent::create(QQmlContext *context = nullptr)

在此组件的指定context中创建一个对象实例。如果创建失败,则返回nullptr

如果 contextnullptr(默认值),它将在引擎的根上下文中创建实例。

返回的对象实例的所有权传递给调用者。

如果从这个组件创建的对象是一个可视项,它必须有一个可视父项,这可以通过调用QQuickItem::setParentItem () 来设置。有关详细信息,请参阅概念 - Qt Quick 中的可视父项

另请参阅:QQmlEngine::ObjectOwnership

void QQmlComponent::create(QQmlIncubator &incubator, QQmlContext *context = nullptr, QQmlContext *forContext = nullptr)

使用提供的 incubator 从该组件创建一个对象实例。context 指定创建对象实例的上下文。

如果 contextnullptr(默认值),它将在引擎的根上下文中创建实例。

forContext 指定一个此对象创建依赖的上下文。如果 forContext 正在异步创建,并且QQmlIncubator::IncubationModeQQmlIncubator::AsynchronousIfNested,则此对象也将以异步方式创建。如果 forContextnullptr(默认值),则将使用 context 做出此决定。

创建的对象及其创建状态可通过 incubator 获取。

另请参阅 QQmlIncubator.

QObject *QQmlComponent::createWithInitialProperties(const QVariantMap &initialProperties, QQmlContext *context = nullptr)

在指定的 context 中创建本组件的对象实例,并用 initialProperties 初始化其顶级属性。

如果任何 initialProperties 无法设置,将发出警告。如果有未设置的必需属性,对象创建将失败并返回 nullptr,在这种情况下,isError() 将返回 true

另请参阅 QQmlComponent::create.

QQmlContext *QQmlComponent::creationContext() const

返回组件创建时的 QQmlContext。这仅适用于从 QML 直接创建的组件。

QQmlEngine *QQmlComponent::engine() const

返回此组件的 QQmlEngine

QList<QQmlError> QQmlComponent::errors() const

返回上次编译或创建操作期间发生的错误列表。如果没有设置 isError(),则返回空列表。

[since 6.5] bool QQmlComponent::isBound() const

如果组件是在指定了 pragma ComponentBehavior: Bound 的 QML 文件中创建的,则返回 true,否则返回 false。

此函数在Qt 6.5版本中引入。

bool QQmlComponent::isError() const

如果 status() == QQmlComponent::Error。

bool QQmlComponent::isLoading() const

如果 status() == QQmlComponent::Loading。

bool QQmlComponent::isNull() const

如果 status() == QQmlComponent::Null。

bool QQmlComponent::isReady() const

如果 status() == QQmlComponent::Ready。

[slot, since 6.5] void QQmlComponent::loadFromModule(QAnyStringView uri, QAnyStringView typeName, QQmlComponent::CompilationMode mode = PreferSynchronous)

在模块 uri 中加载 typeName 的 QQmlComponent。如果通过 QML 文件实现该类型,则使用 mode 来加载它。支持 C++ 的类型始终同步加载。

QQmlEngine engine;
QQmlComponent component(&engine);
component.loadFromModule("QtQuick", "Item");
// once the component is ready
std::unique_ptr<QObject> item(component.create());
Q_ASSERT(item->metaObject() == &QQuickItem::staticMetaObject);

此函数在Qt 6.5版本中引入。

另请参阅loadUrl

[slot] void QQmlComponent::loadUrl(const QUrl &url)

从提供的url加载QQmlComponent

确保提供的URL是完整且正确的,特别是在从本地文件系统加载文件时,请使用QUrl::fromLocalFile()。

相对路径将与QQmlEngine::baseUrl进行解析,除非指定,否则是当前工作目录。

[slot] void QQmlComponent::loadUrl(const QUrl &url, QQmlComponent::CompilationMode mode)

从提供的url加载QQmlComponent。如果mode异步,组件将异步加载和编译。

确保提供的URL是完整且正确的,特别是在从本地文件系统加载文件时,请使用QUrl::fromLocalFile()。

相对路径将与QQmlEngine::baseUrl进行解析,除非指定,否则是当前工作目录。

[signal] void QQmlComponent::progressChanged(qreal progress)

每当组件的加载进度变化时都会发出。当前的进度值将在 0.0(没有加载)和 1.0(完成)之间。

注意:这是属性 进度的通知器信号。

[slot] void QQmlComponent::setData(const QByteArray &data, const QUrl &url)

设置QQmlComponent以使用给定的QML数据。如果提供了url,它将用于设置组件名称并为该组件解析的项目提供一个基本路径。

void QQmlComponent::setInitialProperties(QObject *component, const QVariantMap &properties)

设置组件的顶级属性

此方法提供对组件实例创建的高级控制。通常,程序员应使用 QQmlComponent::createWithInitialProperties 来创建组件。

在调用beginCreate之后和调用completeCreate之前使用此方法。如果提供的属性不存在,将发出警告。

[signal] void QQmlComponent::statusChanged(QQmlComponent::Status status)

每当组件的状态变化时都会发出。当前的状态将是最新的状态。

注意:这是属性 状态的通知器信号。

© 2024 Qt 公司有限公司。此处包含的文档贡献的版权属于其各自的所有者。提供的文档根据自由软件基金会发布的GNU 自由文档许可证版本 1.3 的条款进行许可。Qt和相应的标志是芬兰和/或其他国家的Qt公司的商标。所有其他商标均为其各自所有者的财产。