一、前言
通过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