参考第二个例子:https://blog.csdn.net/gongjianbo1992/article/details/87965925
加载分为两部分,一个是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++: https://blog.csdn.net/iceboy314159/article/details/79189514 Q_INVOKABLE与invokeMethod: https://blog.csdn.net/txgc1009/article/details/6630928 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; } } }在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的数据模型是否就是基于此?
https://blog.csdn.net/gongjianbo1992/article/details/87965925