国产探花免费观看_亚洲丰满少妇自慰呻吟_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)));
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 新竹市| 手游| 秦安县| 岳阳市| 康马县| 梅河口市| 金寨县| 鸡东县| 遂溪县| 集贤县| 理塘县| 龙里县| 滨州市| 满城县| 凌云县| 德化县| 遂溪县| 济宁市| 安乡县| 鲜城| 外汇| 齐齐哈尔市| 鹤岗市| 兴宁市| 沁水县| 胶州市| 基隆市| 广德县| 怀化市| 济南市| 饶平县| 中宁县| 凯里市| 许昌市| 铁岭市| 曲松县| 蓬安县| 衡山县| 仙居县| 和硕县| 南川市|