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

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

C++與QML交互2:在QML中調用C++特性

2019-11-07 23:45:19
字體:
來源:轉載
供稿:網友
QML引擎(QQmlEngine)集成了Qt元對象系統,由QObject派生的所有子類的屬性、方法和信號等都可以在QML中訪問。QObject是子類有多種辦法將功能暴露給QML訪問:1、把C++類注冊為一個可實例化的QML對象類型,調用方法跟普通的QML類型一樣。2、把C++類注冊為一個單例類型,可以在QML中導入單例對象實例3、把C++類作為上下文屬性或者上下文對象嵌入到QML中在啟動QML時,會初始化一個QQmlEngine作為QML引擎,然后使用QQmlComponent對象加載QML文檔,QML引擎會提供一個默認的QQmlContext對象作為頂層執行的上下文,用來執行QML文檔中定義的函數和表達式。QQmlEngine::rootContext() 返回當前引擎QML的上下文,唯一的,QQmlContext* QQuickView::rootContext()QQuickItem* QQuickView::rootObject() 返回當前QQuickView的根節點,也就是QML的根節點QQmlEngineQQmlEngine類提供了一個QML引擎,用于管理由QML文檔定義的對象層次架構,QML提供了一個默認的QML上下文(根上下文,獲取函數QQmlEngine::rootContext())。該上下文是QML表達式的執行環境,并且保證在使用時對象屬性能夠被正確更新。QQmlEngine可以將全局設置應用到其管理下的所有QML對象,比如網絡通信:QNetworkaccessManager、全局永久(整個程序生命周期)存儲的文件路徑(資源預加載)等QQmlContextQQmlContext提供了對象實例化和表達式執行所需要的上下文環境。所有的QML對象都要在特定的上下文中實例化,所有的表達式都要在特定的上下文中執行。上下文以根上下文為主組成層次結構,子上下文繼承父上下文的屬性,修改子上下文的屬性值可以覆蓋父上下文的屬性值。QQmlContext::setContextPRoperty()能夠通過名字將數據顯示綁定到上下文,定義、更新上下文的屬性【注意】使用QQmlContext::setContextProperty()顯示設置對象的屬性會優先于上下文對象的屬性QQmlComponentQML文檔定義的對象類型可以在運行時使用QQmlComponent類進行實例化,QQmlComponent封裝了QML組件(component)的定義,可以用于加載QML文檔,前提條件是需要QQmlEngine實例化QML文檔中定義的對象層次結構。QQmlComponent實例既可以使用C++直接創建,也可以通過Qt.createComponent()函數在QML代碼中創建QQmlExpression 動態執行表達式QQmlExpression允許客戶端,在C++中利用一個特定的QML上下文執行javaScript表達式,表達式執行的結果以QVariant的形式返回,并且遵守QML引擎確定的轉換規則。二、在QML中使用C++特性由于QML引擎與Qt元對象系統的緊密集成,QML可以直接訪問QObject子類的屬性、方法、信號等。1、QML可以直接讀取和修改C++的屬性2、QML可以通過Javascript直接調用C++方法3、QML可以接收C++的信號由于QML和C++兩者運行所需要的上下文環境不同,當QML訪問C++數據時,數據的所有權還在C++,特例:就是一個顯示的C++函數調用并且返回QObject類型,QML引擎訪問獲取數據的所有權。Qt提供了兩種在QML訪問C++的方法:法1:在C++中創建一個類,注冊為QML環境的一個類型,在QML中就可以使用這個類創建對象進行訪問。法2:在C++構建一個對象,把對象通過QQmlContext::setContextProperty()設置到QML的上下文,在QML中可直接使用該對象。1、把C++創建的類設置到QML上下文類的要求:(1)QObject類或繼承QObject。(2)調用宏Q_OBJECT。這樣的類能夠進入Qt元對象系統,也會被QML訪問。以下是QML經常訪問的C++類型(1)QML訪問C++信號、槽例子:創建類:                                                                把類加入QML上下文:                                                                              QML中訪問C++類class MakeClass : public QObject                        QQmlEngine engine;                                                                               text = qml_make.SetStr("Hello for QML!!!");{                                                                             MakeClass Cmake;   //類對象,在下邊設置上下文                                   qml_make.SlotMake();    Q_OBJECT                                                         engine.rootContext->setContextProperty("qml_make",&Cmake)    public:         Q_INVOKABLE void SetStr(QString str);    signals:   //C++信號          void MakeSignal(QString str);    public slots:  //C++槽函數          void SlotMake();};(2)Q_INVOKABLE 宏修飾函數,會注冊到Qt元對象系統中,QML可以直接訪問 ${Object}.${method}定義函數:Q_INVOKABLE void SetStr(QString str);QML中使用函數:text = qml_make.SetStr("Hello for QML!!!");(3)Q_ENUMS 宏修飾枚舉,會注冊到Qt元對象系統中,QML可以直接訪問 ${Object}.${method}定義枚舉:Q_ENUMS(m_enum);QML中使用枚舉:text = qml_make.m_enum;(4)Q_PROPERTY 宏修飾屬性,會注冊到Qt元對象系統中,QML可以對屬性進行訪問、修改、屬性改變發送信號等操作。定義屬性:Q_PROPERTY(QString Test                //定義一個QString類型的Text屬性                                             READ GetTest         //定義讀操作                                                                                               WRITE SetText        //定義寫操作                                             NOTIFY SlotTextChanged      //定義關聯信號,當屬性發生改變時,觸發信號)QML中使用屬性:text = qml_make.GetText;    //調用C++中Text屬性的讀操作                         Component.onCompleted: {                               qml_make.SetText = "Text for QML"    //調用C++中Text屬性的寫操作                                      }  2、把C++對象注冊到QML中,當做一個QML對象QObject 類或 QObject 子類都可以注冊到QML中,在QML中當做一個對象類型進行實例化注冊QML類型有多個方法:(1)qmlRegisterSingletonType()            注冊一個單例類型(2)qmlRegisterType()                             注冊一個非單例類型(3)qmlRegisterTypeNotAvailaible()      注冊一個類型用來占位(4)qmlRegisterUncreatableType()        注冊一個具有附加屬性類型例子:(1)創建類:                                                                                                                                              class MakeClass : public QObject                                                                                                       {                                                                                                                  Q_OBJECT                                                             public:                                                                        Q_INVOKABLE void SetStr(QString str);         Q_PROPERTY(QString Test                //定義一個QString類型的Text屬性                                             READ GetTest         //定義讀操作                                                                                               WRITE SetText        //定義寫操作                                             NOTIFY SlotTextChanged      //定義關聯信號,當屬性發生改變時,觸發信號    signals:   //C++信號          void MakeSignal(QString str);    public slots:  //C++槽函數          void SlotMake();};(2)在main函數把類注冊到QML中,注冊函數要放到QML上下文創建之前,否則注冊不成功:qmlRegisterType<MakeClass>("For.Qt.MakeClass" , 1, 0, "MakeClassQml");      //把類MakeClass注冊到QML中的包為:For.Qt.MakeClass, 版本:1.0, 類型為:MakeClassQmlQQuickView view; view.setSource( QUrl(QStringLiteral("qrc:///main.qml")));  view.show();  (3)QML引入并且訪問C++對象類型import For.Qt.MakeClass 1.0 Item{    MakeClassQml{                             SetText : "Hello for QML"   //C++屬性的寫操作    }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 高青县| 治县。| 茌平县| 临泉县| 和平区| 福泉市| 东乌珠穆沁旗| 海宁市| 靖边县| 青浦区| 黄石市| 策勒县| 南投市| 高尔夫| 合作市| 湛江市| 浙江省| 平顺县| 营山县| 曲阜市| 黄梅县| 洪雅县| 疏附县| 宁德市| 舟曲县| 东乡| 双城市| 贵溪市| 宝应县| 连城县| 桦南县| 高淳县| 鹤庆县| 那坡县| 义乌市| 溆浦县| 麻阳| 太保市| 石家庄市| 阳朔县| 新安县|