国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++與QML交互1:在C++中調用QML對象

2019-11-07 23:45:24
字體:
來源:轉載
供稿:網友
一、C++中調用QML對象所有的QML對象類型,包括QML引擎內部實現或者實現第三方庫,都是QObject子類,都允許QML引擎使用Qt元對象系統動態實例化任何QML對象類型。在啟動QML時,會初始化一個QQmlEngine作為QML引擎,然后使用QQmlComponent對象加載QML文檔,QML引擎會提供一個默認的QQmlContext對象作為頂層執行的上下文,用來執行QML文檔中定義的函數和表達式。QQmlEngine::rootContext() 返回當前引擎QML的上下文,唯一的,QQmlContext* QQuickView::rootContext()QQuickItem* QQuickView::rootObject() 返回當前QQuickView的根節點,也就是QML的根節點1、使用C++加載QML對象(1)使用QQmlComponent進行加載,讀取QML文檔,將轉換成C++對象,進行賦值操作。例子:QQmlEngine engine;                                                                                 //QML引擎QQmlComponent component(&engine, QUrl(QStringLiteral("qrc:///main.qml")));       //加載QML//用QQmlComponent創建一個組件的實例,并且賦值給object*,這步操作非常關鍵,Object類型可以轉換其他任意類型,比如QQuickItemQObject* object = component.create();                   object->setPRoperty("width", 500);                                                           //元對象系統賦值操作QQmlProperty(object, "width").write(500);                                              //元對象系統賦值操作QQuickItem* item = qobject_cast<QQuickItem*>(object);                    //把 QObject* 轉換成 QQuickItem* 類型tiem->setWidth(500);                                                                               //QQuickItem* 賦值操作(2)使用QQuickView加載,QQuickView是繼承QWindow,所有可以加載一個可視化QML對象,并且可以與應用程序的圖形用戶界面進行融合。例子:QQuickView view;                                                                       //QQuickView對象view.setSource( QUrl(QStringLiteral("qrc:///main.qml")));       //加載QMLview.show();                                                                                //QQuickView可以顯示可視化QML對象QQuickItem* item = view.rootObject();                                   //返回當前QQuickView的根節點tiem->setWidth(500);                                                                //QQuickItem* 賦值操作2、使用對象名字訪問加載的QML對象QML中的所有節點都會綁定到根節點樹上,QObject::objectName這個屬性保存特定對象。QML組件的子對象可以在C++中通過 QObject::findChild()查找到在QML中用objectName定義的對象。bool QObject::setProperty(const char *name, const QVariant &value)  元對象系統的設置函數

T QObject::findChild(const QString &name = QString(), Qt::FindChildOptionsoptions = Qt::FindChildrenRecursively) const  是一個QObject類型的模板函數,意味著可以轉成任意類型如:

QPushButton* button = root.findChild<QPushButton*>("qml_button")

QObject* object = root.findChild<QObject*>("qml_object")

QQuickItem* item = root.findChild<QQuickItem*>("qml_item")

如果有多個對象使用objectName:"qml_button"同名標記,QObject::findChild返回最后一個標記的QML對象,QObject::findChildren返回所有標記的QML對象存放在QList類型的列表中。例子:QQuickView view;                                                                       //QQuickView對象view.setSource( QUrl(QStringLiteral("qrc:///main.qml")));       //加載QMLview.show();                                                                                //QQuickView可以顯示可視化QML對象QQuickItem* root = view.rootObject();                                     //返回當前QQuickView的根節點,底下可以綁定很多節點                                                                             //在根節點root中查找有objectName:"qml_button"這個標志位保存的QML節點qml_ButtonQObject* button = root->findChild<QObject*>("qml_button");       button->setProperty("width", 500);                                                   //在根節點root中查找有objectName:"qml_item"這個標志位保存的QML節點qml_item,換成QQuickItem*類型QQuickItem* item = root->findChild<QQuickItem*>("qml_item");   item->setProperty("color", "red");3、使用C++訪問QML對象成員(1)所有的QML對象都會暴露在Qt的元對象系統,C++可以通過元對象系統的QMetaObject::invokeMethod()調用QML中注冊到元對象系統函數。例子:qml中定義的函數:function qmlFunction(msg){    console.log("QML get message:",msg);}C++調用QML函數:QQmlEngine engine;                                                                                 //QML引擎QQmlComponent component(&engine, QUrl(QStringLiteral("qrc:///main.qml")));       //加載QMLQObject* object = component.create();                   //用QQmlComponent創建一個組件的實例,并且賦值給object*,這步操作非常關鍵,Object類型可以轉換其他任意類型,比如QQuickItemQVariant rValue;QVariant msg = "Hello for C++";QMetaObject::invokeMethod(object,  "qmlFunction",  Q_RETURN_ARG(QVariant,rValue),  Q_ARG(QVariant, msg));(2)C++可以接收所有的QML信號,QML也可以接收C++信號,在C++中可以使QObject::connect()進行接收信號槽。例子:qml中定義一個信號:signal qmlSignal(string msg)C++進行連接信號:QQuickView view;                                                                       //QQuickView對象view.setSource( QUrl(QStringLiteral("qrc:///main.qml")));       //加載QMLview.show();                                                                                //QQuickView可以顯示可視化QML對象QQuickItem* root = view.rootObject();                                     //返回當前QQuickView的根節點,底下可以綁定很多節點QObject::connect(root,  SIGNAL(qmlSignal(QString)),  this,  SLOT(Slotqml(QString)));
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 杭锦后旗| 随州市| 安达市| 科技| 连平县| 贵德县| 张北县| 久治县| 泊头市| 阿瓦提县| 长沙市| 邢台县| 雅安市| 西盟| 宜章县| 遂溪县| 遂平县| 辽阳县| 富裕县| 丹寨县| 胶南市| 额尔古纳市| 溆浦县| 高阳县| 萍乡市| 南乐县| 泰州市| 凌云县| 阿勒泰市| 新巴尔虎右旗| 临潭县| 报价| 施秉县| 嘉黎县| 阳朔县| 深圳市| 育儿| 醴陵市| 苗栗市| 周宁县| 平邑县|