QQmlComponent 类
QQmlComponent 类封装了 QML 组件的定义。 更多信息...
头文件 | #include <QQmlComponent> |
CMake | find_package(Qt6 REQUIRED COMPONENTS Qml) target_link_libraries(mytarget PRIVATE Qt6::Qml) |
qmake | QT += 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 void | completeCreate() |
virtual QObject * | create(QQmlContext *context = nullptr) |
void | create(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起) bool | isBound() const |
bool | isError() const |
bool | isLoading() const |
bool | isNull() const |
bool | isReady() const |
qreal | progress() const |
void | setInitialProperties(QObject *component, const QVariantMap &properties) |
QQmlComponent::Status | status() const |
QUrl | url() const |
公共插槽
(自6.5起) void | loadFromModule(QAnyStringView uri, QAnyStringView typeName, QQmlComponent::CompilationMode mode = PreferSynchronous) |
void | loadUrl(const QUrl &url) |
void | loadUrl(const QUrl &url, QQmlComponent::CompilationMode mode) |
void | setData(const QByteArray &data, const QUrl &url) |
信号
void | progressChanged(qreal progress) |
void | statusChanged(QQmlComponent::Status status) |
详细描述
组件是可重用的、封装良好的QML类型,具有明确的接口。
可以从QML文件创建QQmlComponent实例。例如,如果有一个这样的main.qml
文件
import QtQuick 2.0 Item { width: 200 height: 200 }
以下代码将此QML文件作为组件加载,使用create()创建此组件的实例,然后查询Item的width值
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::PreferSynchronous | 0 | 建议立即加载/编译组件,阻塞线程。这并不总是可能的;例如,远程URL总是会异步加载。 |
QQmlComponent::Asynchronous | 1 | 在后台线程加载/编译组件。 |
枚举 QQmlComponent::状态
指定 QQmlComponent 的加载状态。
常量 | 值 | 描述 |
---|---|---|
QQmlComponent::Null | 0 | 此 QQmlComponent 没有数据。调用 loadUrl() 或 setData() 添加 QML 内容。 |
QQmlComponent::Ready | 1 | 此 QQmlComponent 已准备好,可调用 create()。 |
QQmlComponent::Loading | 2 | 此 QQmlComponent 正在加载网络数据。 |
QQmlComponent::Error | 3 | 发生错误。调用 errors() 获取错误列表。 |
属性文档
[只读]
progress : const qreal
组件加载进度,从 0.0(未加载)到 1.0(完成)。
访问函数
qreal | progress() const |
通知信号
void | progressChanged(qreal progress) |
[只读]
status : const 状态
组件的当前 状态。
访问函数
QQmlComponent::Status | status() const |
通知信号
void | statusChanged(QQmlComponent::Status status) |
[只读]
url : const QUrl
组件的 URL。这是传递给构造函数、loadUrl() 或 setData() 方法的 URL。
访问函数
QUrl | url() const |
成员函数文档
QQmlComponent::QQmlComponent(QQmlEngine *engine, QObject *parent = nullptr)
创建一个无数据的 QQmlComponent,并赋予它指定的 engine 和 parent。使用 setData() 设置数据。
QQmlComponent::QQmlComponent(QQmlEngine *engine, const QString &fileName, QObject *parent = nullptr)
从给定的 fileName 创建 QQmlComponent,并赋予它指定的 parent 和 engine。
另请参阅loadUrl。
QQmlComponent::QQmlComponent(QQmlEngine *engine, const QString &fileName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)
根据给定的fileName
创建QQmlComponent,并赋给它指定的parent
和engine
。如果mode
是异步,该组件将会异步加载和编译。
另请参阅loadUrl。
QQmlComponent::QQmlComponent(QQmlEngine *engine, const QUrl &url, QObject *parent = nullptr)
根据给定的url
创建QQmlComponent,并赋给它指定的parent
和engine
。
确保提供的URL是完整且正确的,特别是在从本地文件系统加载文件时,请使用QUrl::fromLocalFile()。
相对路径将与QQmlEngine::baseUrl进行解析,除非指定,否则是当前工作目录。
另请参阅loadUrl。
QQmlComponent::QQmlComponent(QQmlEngine *engine, const QUrl &url, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)
根据给定的url
创建QQmlComponent,并赋给它指定的parent
和engine
。如果mode
是异步,该组件将会异步加载和编译。
确保提供的URL是完整且正确的,特别是在从本地文件系统加载文件时,请使用QUrl::fromLocalFile()。
相对路径将与QQmlEngine::baseUrl进行解析,除非指定,否则是当前工作目录。
另请参阅loadUrl。
[显式,自6.5版本开始]
QQmlComponent::QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QObject *parent = nullptr)
从给定的uri
和typeName
创建QQmlComponent,并给它指定的parent
和engine
。如果可能,组件将同步加载。
这是一个重载函数。
此函数在Qt 6.5版本中引入。
另请参阅loadFromModule。
[显式,自6.5版本开始]
QQmlComponent::QQmlComponent(QQmlEngine *engine, QAnyStringView uri, QAnyStringView typeName, QQmlComponent::CompilationMode mode, QObject *parent = nullptr)
从给定的uri
和typeName
创建QQmlComponent,并给它指定的parent
和engine
。如果mode
是异步,该组件将会异步加载和编译。
这是一个重载函数。
此函数在Qt 6.5版本中引入。
另请参阅loadFromModule。
[重载虚析构函数,异常不抛出]
QQmlComponent::~QQmlComponent()
销毁QQmlComponent对象。
[虚拟]
QObject *QQmlComponent::beginCreate(QQmlContext *context)
在此组件的指定context
中创建一个对象实例。如果创建失败,则返回nullptr
。
注意:此方法提供了对组件实例创建的高级控制。通常,程序员应使用QQmlComponent::create()来创建对象实例。
当QQmlComponent构建一个实例时,它包含三个步骤:
- 创建对象层次结构,并分配常量值。
- 首次评估属性绑定。
- 如果适用,将在对象上调用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
。
如果 context 为 nullptr
(默认值),它将在引擎的根上下文中创建实例。
返回的对象实例的所有权传递给调用者。
如果从这个组件创建的对象是一个可视项,它必须有一个可视父项,这可以通过调用QQuickItem::setParentItem () 来设置。有关详细信息,请参阅概念 - Qt Quick 中的可视父项。
另请参阅:QQmlEngine::ObjectOwnership。
void QQmlComponent::create(QQmlIncubator &incubator, QQmlContext *context = nullptr, QQmlContext *forContext = nullptr)
使用提供的 incubator 从该组件创建一个对象实例。context 指定创建对象实例的上下文。
如果 context 为 nullptr
(默认值),它将在引擎的根上下文中创建实例。
forContext 指定一个此对象创建依赖的上下文。如果 forContext 正在异步创建,并且QQmlIncubator::IncubationMode 是QQmlIncubator::AsynchronousIfNested,则此对象也将以异步方式创建。如果 forContext 为 nullptr
(默认值),则将使用 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公司的商标。所有其他商标均为其各自所有者的财产。