本页内容

使用上下文属性将 C++ 对象嵌入 QML

警告:在 QML 代码中使用上下文属性,会使 您的 QML 代码依赖于编写时所设想的特定上下文。由于代码在其他使用场景中的上下文可能不同,这会限制代码的可复用性。此外,这种依赖关系并未被显式声明。 您从未通过 `import ` 指定上下文,也未以其他方式说明您的预期。因此,任何试图复用您代码的人都将难以确定复用位置的上下文是否足以满足您的代码需求。

警告: 在将代码加载到 QML 引擎之前,任何预处理 QML 代码的工具都无法识别上下文 属性。 Qt Quick Compiler、qmllint 以及 QML Language Server 等工具均无法识别您的上下文属性,并将任何对上下文属性的访问视为未限定访问。

注意:上下文 属性通常可以由组件根对象上的常规属性替代,也可以由使用QML_SINGLETON在 C++ 中定义的单例,或使用pragma Singleton 在 QML 中定义的单例替代。

将 QML 对象加载到 C++ 应用程序中时,直接嵌入一些可在 QML 代码内部使用的 C++ 数据会非常有用。例如,这使得可以调用嵌入对象上的 C++ 方法,或者将 C++ 对象实例用作 QML 视图的数据模型。

QQmlContext 类实现了将C++数据注入QML对象的功能。该类将数据暴露给QML对象的上下文,从而允许在QML代码的作用域内直接引用这些数据。

设置一个简单的上下文属性

例如,以下是一个引用当前作用域中不存在的 `currentDateTime ` 值的 QML 项:

// MyItem.qml
import QtQuick

Text { text: currentDateTime }

加载该 QML 组件的 C++ 应用程序可以使用 `QQmlContext::setContextProperty()` 直接设置此 `currentDateTime ` 值:

QQuickView view;
view.rootContext()->setContextProperty("currentDateTime", QDateTime::currentDateTime());
view.setSource(QUrl::fromLocalFile("MyItem.qml"));
view.show();

注意:由于 在 QML 中评估的所有表达式都在特定上下文中进行,因此 如果上下文发生更改,该上下文中的所有绑定都会被重新评估。因此,在应用程序初始化之外使用上下文属性时应谨慎,否则可能会导致应用程序性能下降。

将对象设置为上下文属性

上下文属性可以存储QVariant 或QObject*类型的值。这意味着也可以通过此方法注入自定义C++对象,并且这些对象可以在QML中直接进行修改和读取。在此,我们将上面的示例修改为嵌入一个QObject 实例,而不是QDateTime 值,并且QML代码会调用该对象实例上的方法:

C++
class ApplicationData : public QObject
{
    Q_OBJECT
public:
    Q_INVOKABLE QDateTime getCurrentDateTime() const {
        return QDateTime::currentDateTime();
    }
};

int main(int argc, char *argv[]) {
    QGuiApplication app(argc, argv);

    QQuickView view;

    ApplicationData data;
    view.rootContext()->setContextProperty("applicationData", &data);

    view.setSource(QUrl::fromLocalFile("MyItem.qml"));
    view.show();

    return app.exec();
}
QML
// MyItem.qml
import QtQuick

Text { text: applicationData.getCurrentDateTime() }

(请注意,从 C++ 返回给 QML 的日期/时间值可通过 `Qt.formatDateTime()` 及其相关函数进行格式化。)

如果 QML 项需要接收来自上下文属性的信号,可以使用Connections 类型将其连接起来。例如,如果ApplicationData 有一个名为dataChanged() 的信号,则可以在Connections 对象中使用onDataChanged 处理程序将其连接起来:

Text {
    text: applicationData.getCurrentDateTime()

    Connections {
        target: applicationData
        onDataChanged: console.log("The application data changed!")
    }
}

有关更多信息,请参阅QQmlContext 文档。

© 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.