QML QQmlContext
QQmlContext参考:官方文档https://doc.qt.io/qt-5/qqmlcontext.htmlQQmlContext类在QML引擎中定义了一个上下文。Header:#include <QQmlContext>qmake:QT += qmlInherits:QObject详细说明上下文允许将数据公开给由QML引擎实例化的QML组件。每个QQmlContext包含一组属
·
QQmlContext
- 参考:官方文档 https://doc.qt.io/qt-5/qqmlcontext.html
- QQmlContext类在QML引擎中定义了一个上下文。
Header: #include <QQmlContext> qmake: QT += qml Inherits: QObject
详细说明
- 上下文允许将数据公开给由QML引擎实例化的QML组件。
- 每个QQmlContext包含一组属性,不同于它的QObject属性,这些属性允许根据名称显式地将数据绑定到上下文。
- 通过调用 QQmlContext::setContextProperty() 来定义和更新上下文属性。
- 下面的示例展示了将Qt模型绑定到一个上下文,然后从QML文件访问它。
QQmlEngine engine; QStringListModel modelData; QQmlContext *context = new QQmlContext(engine.rootContext()); context->setContextProperty("myModel", &modelData); QQmlComponent component(&engine); component.setData("import QtQuick 2.0\nListView { model: myModel }", QUrl()); QObject *window = component.create(context);
- 注意:
- 创建者有责任删除它构造的任何QQmlContext。
- 如果在销毁窗口组件实例时不再需要示例中的上下文对象,则必须显式地销毁该上下文。
- 确保这一点的最简单方法是将window设置为context的父类。
- 为了简化绑定和维护更大的数据集,可以在QQmlContext上设置上下文对象。
- 上下文对象的所有属性都可以通过名称在上下文中获得,就好像它们都是通过调用QQmlContext::setContextProperty()单独添加的一样。
- 通过属性的通知信号检测属性值的更改。与手动添加和维护上下文属性值相比,设置上下文对象既快又容易。
- 下面的示例与前一个示例具有相同的效果,但它使用了上下文对象:
class MyDataSet : ... { ... Q_PROPERTY(QAbstractItemModel *myModel READ model NOTIFY modelChanged) ... }; MyDataSet myDataSet; QQmlEngine engine; QQmlContext *context = new QQmlContext(engine.rootContext()); context->setContextObject(&myDataSet); QQmlComponent component(&engine); component.setData("import QtQuick 2.0\nListView { model: myModel }", QUrl()); component.create(context);
- 所有由QQmlContext::setContextProperty()显式添加的属性优先于上下文对象的属性。
上下文层次结构
- 上下文形成了一个层次结构。这个层次结构的根是QML引擎的根上下文。子上下文继承父上下文的上下文属性;如果子上下文设置了父上下文中已经存在的上下文属性,则新上下文属性将覆盖父上下文属性。
- 下面的例子定义了两个上下文——context1和context2。第二个上下文用一个新值覆盖从第一个上下文继承的“b”上下文属性。
QQmlEngine engine; QQmlContext *context1 = new QQmlContext(engine.rootContext()); QQmlContext *context2 = new QQmlContext(context1); context1->setContextProperty("a", 12); context1->setContextProperty("b", 12); context2->setContextProperty("b", 15);
- 虽然在上下文中实例化的QML对象并不严格属于该上下文,但它们的绑定属于该上下文。如果上下文被销毁,未完成的QML对象的属性绑定将停止计算。
- 警告: 在该上下文中创建对象后,设置上下文对象或添加新的上下文属性是一个代价昂贵的操作(实质上是强制所有绑定重新求值)。
- 因此,在使用上下文创建任何对象之前,只要有可能,都应该完成上下文的“设置”。
- 参考: Exposing Attributes of C++ Types to QML.
成员函数文档
QQmlContext::QQmlContext(QQmlContext *parentContext, QObject *parent = nullptr)
- 使用给定的parentContext和QObject父对象创建一个新的QQmlContext。
QQmlContext::QQmlContext(QQmlEngine *engine, QObject *parent = nullptr)
- 创建一个新的QQmlContext作为引擎的根上下文和QObject父上下文的子上下文。
QQmlContext::~QQmlContext()
- 销毁了QQmlContext。
- 依赖于此上下文的任何表达式或子上下文都将失效,但不会被销毁(除非它们是QQmlContext对象的父对象)。
QUrl QQmlContext::baseUrl() const
- 返回组件的基url,如果没有设置,则返回包含组件的url。
- 参考:setBaseUrl().
QObject *QQmlContext::contextObject() const
- 返回上下文对象,如果没有上下文对象则返回0。
- 参考:setContextObject().
QVariant QQmlContext::contextProperty(const QString &name) const
- 将此上下文的name属性的值作为QVariant返回。
- 参考:setContextProperty().
QQmlEngine *QQmlContext::engine() const
- 回上下文的 QQmlEngine,,如果上下文没有QQmlEngine或QQmlEngine已被销毁则返回0。
bool QQmlContext::isValid() const
- 返回上下文是否有效。
- 为了有效,上下文必须有一个引擎,并且它的contextObject()(如果有的话)必须没有被删除。
QString QQmlContext::nameForObject(QObject *object) const
- 返回该上下文中对象的名称,如果对象没有在上下文中命名,则返回一个空字符串。
- 对象通过setContextProperty()命名,或者在QML创建的上下文中通过id命名。
- 如果对象有多个名称,则返回第一个名称。
QQmlContext *QQmlContext::parentContext() const
- 返回上下文的父QQmlContext,如果该上下文没有父上下文或父上下文已被销毁,则返回0
QUrl QQmlContext::resolvedUrl(const QUrl &src)
- 解析URL src相对于包含组件的URL
- 参考: QQmlEngine::baseUrl() and setBaseUrl().
void QQmlContext::setBaseUrl(const QUrl &baseUrl)
- 显式设置resolvedUrl()将用于对baseUrl的相对引用。
- 调用此函数将覆盖默认使用的包含组件的url。
- 参考:baseUrl() and resolvedUrl().
void QQmlContext::setContextObject(QObject *object)
- 设置上下文对象。
- 参考:contextObject().
void QQmlContext::setContextProperties(const QVector<QQmlContext::PropertyPair> &properties)
- 在此上下文中设置一批属性。
- 在一个批处理中设置所有属性可以避免不必要的刷新表达式,因此建议不要为每个单独的属性调用setContextProperty()。
- 该函数是在qt5.11中引入的。
- 参考:QQmlContext::setContextProperty().
void QQmlContext::setContextProperty(const QString &name, QObject *value)
- 在此上下文中设置name属性的值。
- QQmlContext不接值的所有权。
- 参考: contextProperty().
void QQmlContext::setContextProperty(const QString &name, const QVariant &value)
- 在此上下文中设置name属性的值。
更多推荐

所有评论(0)