QQmlContext Class
QQmlContext 类定义了 QML 引擎中的一个上下文。更多内容...
| 标题: | #include <QQmlContext> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Qml) target_link_libraries(mytarget PRIVATE Qt6::Qml) |
| qmake: | QT += qml |
| 继承自: | QObject |
公共类型
| struct | PropertyPair |
公共函数
| QQmlContext(QQmlContext *parentContext, QObject *parent = nullptr) | |
| QQmlContext(QQmlEngine *engine, QObject *parent = nullptr) | |
| virtual | ~QQmlContext() override |
| QUrl | baseUrl() const |
(since 6.11) QList<QQmlContext *> | childContexts() const |
| QObject * | contextObject() const |
| QVariant | contextProperty(const QString &name) const |
| QQmlEngine * | engine() const |
(since 6.11) QObject * | findObjectRecursively(const QString &id) const |
(since 6.11) QList<QObject *> | findObjectsRecursively(const QString &id) const |
| bool | isValid() const |
| QString | nameForObject(const QObject *object) const |
(since 6.2) QObject * | objectForName(const QString &name) const |
| QQmlContext * | parentContext() const |
| QUrl | resolvedUrl(const QUrl &src) const |
| void | setBaseUrl(const QUrl &baseUrl) |
| void | setContextObject(QObject *object) |
| void | setContextProperties(const QList<QQmlContext::PropertyPair> &properties) |
| void | setContextProperty(const QString &name, QObject *value) |
| void | setContextProperty(const QString &name, const QVariant &value) |
详细说明
上下文(Context)用于保存QML文档中由id标识的对象。您可以使用nameForObject()和objectForName()来获取这些对象。
注意: 创建者有 责任删除其构建的任何 QQmlContext。如果不再需要某个 QQmlContext,必须显式地将其销毁。确保这一点的最简单方法是让 QQmlContext 调用parent 。
上下文层次结构
上下文构成一个层次结构。该层次结构的根节点是 QML 引擎的 `root context`。每个 QML 组件在实例化时都会创建自己的上下文,而某些 QML 元素还会为自身创建额外的上下文。
虽然在某个上下文中实例化的 QML 对象并不严格属于该上下文,但它们的绑定却属于该上下文。如果某个上下文被销毁,未释放的 QML 对象的属性绑定将停止评估。
上下文属性
上下文还允许将数据暴露给由 QML 引擎实例化的 QML 组件。此类数据对任何工具(包括 Qt Quick Compiler 以及未来阅读相关 QML 文档的读者。只有当 QML 组件在您设想的特定 C++ 上下文中实例化时,这些数据才会被暴露。在其他地方,可能会暴露不同的上下文数据。
与其使用 QML 上下文向 QML 组件暴露数据,您应创建额外的对象属性来存储数据,或者使用 `singletons`。详细说明请参阅《将 C++ 状态暴露给 QML》。
每个 QQmlContext 都包含一组属性,这些属性与它的QObject 属性不同,允许通过名称将数据显式绑定到上下文中。可以通过调用QQmlContext::setContextProperty() 来定义和更新上下文属性。
为了简化大型数据集的绑定和维护,可以在 QQmlContext 上设置一个上下文对象。 上下文对象的所有属性均可通过名称在上下文中访问,就好像它们都是通过调用QQmlContext::setContextProperty()逐个添加的一样。属性的值发生变化时,将通过该属性的notify信号进行检测。设置一个上下文对象比手动添加和维护上下文属性值既更快也更简单。
所有通过QQmlContext::setContextProperty() 显式添加的属性都优先于上下文对象的属性。
子上下文会继承其父上下文的上下文属性;如果子上下文设置了一个在其父上下文中已存在的上下文属性,则新设置的上下文属性将覆盖父上下文中的该属性。
警告: 在该上下文中创建对象后设置 上下文对象或添加新的上下文属性是一项开销较大的操作(本质上会强制所有绑定重新评估)。因此,如果您需要使用上下文属性,应在使用该上下文创建任何对象之前,至少完成上下文的“初始化”。
另请参阅 《将 C++ 类型的属性暴露给 QML》。
成员函数文档
QQmlContext::QQmlContext(QQmlContext *parentContext, QObject *parent = nullptr)
使用给定的parentContext 、QObject 以及parent 创建一个新的QQmlContext。
QQmlContext::QQmlContext(QQmlEngine *engine, QObject *parent = nullptr)
创建一个新的 QQmlContext,将其作为engine 的根上下文的子项,并将QObject parent 。
[override virtual noexcept] QQmlContext::~QQmlContext()
销毁QQmlContext 。
任何依赖于此上下文的表达式或子上下文都将失效,但不会被销毁(除非它们隶属于QQmlContext 对象)。
QUrl QQmlContext::baseUrl() const
返回组件的基准 URL;如果未设置基准 URL,则返回其父组件的基准 URL。
另请参阅 setBaseUrl()。
[since 6.11] QList<QQmlContext *> QQmlContext::childContexts() const
返回上下文的直接子节点 QQmlContexts。
该函数在 Qt 6.11 中引入。
另请参阅 parentContext()、findObjectRecursively() 和findObjectsRecursively()。
QObject *QQmlContext::contextObject() const
返回上下文对象;如果不存在上下文对象,则返回nullptr 。
另请参阅 setContextObject()。
QVariant QQmlContext::contextProperty(const QString &name) const
返回此上下文中name 属性的值,该值以QVariant 的形式返回。如果已知要查找的属性是当前上下文中通过QML id分配的QObject ,则使用objectForName()会更方便且更快。 与objectForName() 和nameForObject() 不同,如果当前上下文中未找到name ,该方法会遍历上下文层次结构并在父上下文中进行搜索。它还会考虑您可能设置的任何contextObject()。
另请参阅 setContextProperty()、objectForName()、nameForObject() 以及contextObject()。
QQmlEngine *QQmlContext::engine() const
返回上下文的QQmlEngine ;如果上下文没有QQmlEngine ,或者QQmlEngine 已被销毁,则返回nullptr 。
[since 6.11] QObject *QQmlContext::findObjectRecursively(const QString &id) const
递归搜索当前上下文及其子上下文,查找 ID 为id 的对象。若找到该对象,则返回该对象;否则返回nullptr 。
在任何给定的上下文中,只能存在一个具有指定id 的对象,但您可以在一个文档中创建多个上下文,例如通过视图和委托。每个上下文都可能包含一个具有指定id 的对象。此处仅返回第一个找到的对象。搜索采用广度优先搜索算法进行。
该函数在 Qt 6.11 中引入。
另请参阅 findObjectsRecursively()、objectForName() 和childContexts()。
[since 6.11] QList<QObject *> QQmlContext::findObjectsRecursively(const QString &id) const
递归搜索当前上下文及其子上下文中 ID 为id 的对象,并返回这些对象的列表。
在任何给定的上下文中,ID 为id 的对象只能有一个,但您可以在一个文档中创建多个上下文,例如通过视图和委托。每个上下文中都可以包含一个 ID 为id 的对象。
该函数于 Qt 6.11 中引入。
另请参阅 findObjectRecursively()、objectForName() 和childContexts()。
bool QQmlContext::isValid() const
返回该上下文是否有效。
要成为有效的上下文,必须拥有一个引擎,且其contextObject()(如有)未被删除。
QString QQmlContext::nameForObject(const QObject *object) const
返回当前上下文中object 的名称;如果object 在该上下文中未被命名,则返回空字符串。对象可通过setContextProperty()进行命名,也可作为上下文对象的属性,而在QML创建的上下文中,则通过ID进行命名。
如果对象有多个名称,则返回第一个名称。
与contextProperty() 不同,此方法不会遍历上下文层次结构。如果在当前上下文中未找到该名称,则返回空字符串。
另请参见 contextProperty() 和objectForName()。
[since 6.2] QObject *QQmlContext::objectForName(const QString &name) const
返回此上下文中给定name 对应的对象。如果该上下文中不存在name ,或者与name 关联的值不是QObject ,则返回nullptr。对象可通过setContextProperty()进行命名,也可作为上下文对象的属性,对于QML创建的上下文,则通过ID进行命名。 与contextProperty()不同,此方法不会遍历上下文层次结构。如果在当前上下文中未找到该名称,则返回nullptr。
该函数在 Qt 6.2 中引入。
另请参见 contextProperty() 和nameForObject()。
QQmlContext *QQmlContext::parentContext() const
返回上下文的父对象QQmlContext ;如果该上下文没有父对象,或者其父对象已被销毁,则返回nullptr 。
QUrl QQmlContext::resolvedUrl(const QUrl &src) const
将 URLsrc 解析为相对于包含该组件的组件的 URL。
另请参阅 QQmlEngine::baseUrl() 和setBaseUrl()。
void QQmlContext::setBaseUrl(const QUrl &baseUrl)
显式设置 `resolvedUrl()` 用于相对引用 `baseUrl` 的 URL。
调用此函数将覆盖包含组件默认使用的 URL。
另请参阅 baseUrl() 和resolvedUrl()。
void QQmlContext::setContextObject(QObject *object)
设置上下文object 。
注意:不应 使用上下文对象向 QML 组件注入值。请 改用单例或常规对象属性。
另请参阅 contextObject()。
void QQmlContext::setContextProperties(const QList<QQmlContext::PropertyPair> &properties)
在此上下文中设置一批properties 。
一次性设置所有属性可避免不必要的表达式刷新,因此建议采用这种方式,而非针对每个属性单独调用setContextProperty()。
注意:不应 使用上下文属性向 QML 组件注入值。请 改用单例或常规对象属性。
另请参阅 QQmlContext::setContextProperty()。
void QQmlContext::setContextProperty(const QString &name, QObject *value)
在此上下文中设置name 属性的value 。
QQmlContext 不会获取对 `value` 的所有权。
注意:不应 使用上下文属性将值注入到 QML 组件中。请 改用单例或常规对象属性。
另请参阅 contextProperty()。
void QQmlContext::setContextProperty(const QString &name, const QVariant &value)
将此上下文中name 属性的value 属性设置为a。
注意:不应 使用上下文属性向 QML 组件注入值。请 改用单例或常规对象属性。
© 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.