QML 与 C++交互 - 04 嵌入C++对象到QML

版权声明:本文为博主原创文章,未经博主允许不得转载。欢迎与我交流:[email protected] https://blog.csdn.net/baidu_33850454/article/details/81949169

一、前言

通过C++加载QML时,如果能将C++对象嵌入到QML中可能会很有用。这使得可以在QML中调用嵌入对象的方法,或者将C++对象实例作为QML视图的数据模型。
通过QQmlContext类可以将C ++数据注入QML对象。此类(QQmlContext)将数据公开给QML对象的上下文,以便可以直接从QML代码的范围内引用数据。

二、详细说明

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

例如,下面的QML代码中将访问一个当前域不存在的值currentDateTime

// MyItem.qml
import QtQuick 2.0

Text { text: currentDateTime }

currentDateTime可以通过C++代码使用QQmlContext::setContextProperty()直接嵌入到QML中。代码如下:

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

注意: 由于QML计算的所有相关表达式都是在特定的上下文中计算的,因此如果更改了上下文,则所有绑定的属性都将重新计算。因此在除了初始化程序之外,应该小心使用上下文属性,这可能导致应用程序性能下降。

2、设置一个对象作为上下文属性

上下文属性可以包含QVariant或QObject *值。这意味着可以使用此方法注入自定义的C ++对象,并且可以在QML中直接修改和读取这些对象。修改上述实例,向QML中嵌入一个QObject实例,而不是一个QDateTime值。
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 2.0

Text { text: applicationData.getCurrentDateTime() }

注意:从C ++返回到QML的日期/时间值可以通过Qt.formatDateTime()和相关函数进行格式化。

2.1 QML处理C++对象的信号

如果QML需要接收上下文的信号,可以通过Connections类型来连接信号。如下:

Text {
    text: applicationData.getCurrentDateTime()

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

上下文属性对与在QML视图中使用基于C++的数据模型非常有用。可以查看以下示例:
1、String ListModel
2、Object ListModel
3、AbstractItemModel

参考链接:http://doc.qt.io/qt-5/qtqml-cppintegration-contextproperties.html

猜你喜欢

转载自blog.csdn.net/baidu_33850454/article/details/81949169