QT: QML与c++相互调用

mac2024-12-12  25

c++如何加载QML对象并且操作QML对象

参考第二个例子:https://blog.csdn.net/gongjianbo1992/article/details/87965925

如何加载访问QML

加载分为两部分,一个是view的显示,一个是QML转换成QObject对象或者QObject的子类对象。

QQuickView view(QUrl("qrc:/main.qml")); view.show(); 获得qml中的实例对象 //直接从view中获得 QObject *qmlObj=view.rootObject(); //将对象强制转换成具体的QObject子类 QQuickItem *item=qobject_cast<QQuickItem*>(qmlObj); //QObject::findChildren()可用于查找具有匹配objectName属性的子项 QObject *qmlRect=qmlObj->findChild<QObject*>("rect"); if(qmlRect){ qDebug()<<"qml rect color"<<qmlRect->property("color"); } 对QML属性的访问 写QML的属性: QObject::setProperty()、QQmlProperty、或QMetaProperty::write()来改变QML的属性值读QML属性: qmlObj->property(“height”); //qml系统自带属性 qmlObj->property(“msg”); //在QML中自定义的属性 item->setWidth(200); //QObject系统子类来设置属性,QObject是基类有通用方法。 对QML方法的访问 QML方法是一个JavaScript的函数;一个函数的有三个要素:函数名,返回值,参数。函数名是必须有的,其次是返回值,最后才是参数。 参数是可有可无,理解这一点就能理解invokeMethod函数的参数的先后顺序了。 //调用QML方法 QVariant val_return; //返回值 QVariant val_arg="=.=!"; //参数值 //Q_RETURN_ARG()和Q_Arg()参数必须制定为QVariant类型 QMetaObject::invokeMethod(qmlObj, "qml_method", Q_RETURN_ARG(QVariant,val_return), Q_ARG(QVariant,val_arg)); qDebug()<<"qml method return value"<<val_return; //函数中返回“ok”

疑问:QVariant的发明就是为了和QML之间传递参数的?

QML调用C++

QML调用C++: https://blog.csdn.net/iceboy314159/article/details/79189514 Q_INVOKABLE与invokeMethod: https://blog.csdn.net/txgc1009/article/details/6630928 QML调用c++包含如下几种:

1. QML调用c++中的方法

2. QML调用c++中某对象的实例或者变量数据

方法有两种

方法一

通过QQmlApplicationEngine.rootContext()->setContextProperty(“DATAMGR”,&data_mgr) 往qml中注入一个:类为QDataMgr、变量名为DATAMGR的data_mgr数据。 这样一来,qml就可以使用data_mgr的数据了。

//c++ QQmlApplicationEngine engine; QDataMgr data_mgr; engine.rootContext()->setContextProperty("DATAMGR",&data_mgr); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); //qml Window { visible: true width: 160 height: 480 title: qsTr("Hello World") Rectangle { id:top2 color: "green"; width:parent.height/3; height: parent.height/3; radius: parent.height/6; Text { id: top1txt text: DATAMGR._txt; anchors.centerIn: parent; } } }

方法二

static QObject* qDataMgrSingletonFactory(QQmlEngine*, QJSEngine*) { QDataMgr* dmgrGlobal = new QDataMgr(); return dmgrGlobal; } int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine; qmlRegisterSingletonType<QDataMgr>("Qt.xq.qdmgrSingleton", 1, 0, "DATAMGR", qDataMgrSingletonFactory); engine.load(QUrl(QStringLiteral("qrc:/main.qml"))); if (engine.rootObjects().isEmpty()) return -1; return app.exec(); }

在qml中加入import Qt.xq.qdmgrSingleton 1.0

//qml import Qt.xq.qdmgrSingleton 1.0 Window { visible: true width: 160 height: 480 title: qsTr("Hello World") Rectangle { id:top2 color: "green"; width:parent.height/3; height: parent.height/3; radius: parent.height/6; Text { id: top1txt text: DATAMGR._txt; anchors.centerIn: parent; } } }

思考: qt的数据模型是否就是基于此?

3. QML调用C++中的对象,或者组件对象

https://blog.csdn.net/gongjianbo1992/article/details/87965925

最新回复(0)