亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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++屬性的寫操作    }}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本久久91av| 成人性生交大片免费观看嘿嘿视频| 91久久久久久久| 国产一区二区三区视频| 亚洲欧美自拍一区| 亚洲精品动漫100p| 91视频免费网站| 精品国产美女在线| 欧美一区二区三区四区在线| 国产有码在线一区二区视频| 国产精品激情自拍| 国产精品久久久久久久久免费| 成人精品网站在线观看| 久久久久久久久久久国产| 中日韩美女免费视频网址在线观看| www.亚洲一二| 日韩中文娱乐网| 亚洲天堂一区二区三区| 欧美中文字幕在线观看| 欧美—级a级欧美特级ar全黄| 国产亚洲精品久久久久久777| 日韩一区二区福利| 成人有码视频在线播放| 日韩免费不卡av| 色婷婷成人综合| 欧美性高跟鞋xxxxhd| 欧美性生交xxxxxdddd| 欧美日韩免费区域视频在线观看| 久久久久免费视频| 国产日韩av在线播放| 亚洲精品影视在线观看| 日韩欧美在线国产| 国产精品久久久久久久久久久久| 欧美日韩在线视频一区二区| 91色中文字幕| 日韩美女视频免费看| 热99在线视频| 欧美日韩加勒比精品一区| 成人黄色av网站| 中文字幕不卡在线视频极品| 色偷偷偷综合中文字幕;dd| 国产一区二区精品丝袜| 久久男人av资源网站| 北条麻妃在线一区二区| 日韩av网址在线| 亚洲成人激情小说| 国产香蕉97碰碰久久人人| 久久久久久久网站| 91精品国产777在线观看| 国产亚洲精品一区二555| 国产欧美一区二区三区久久人妖| 国产在线观看精品| 欧美精品久久久久a| 一区二区三区动漫| 亚洲无av在线中文字幕| 97久久久久久| 亚洲第一男人天堂| 91色精品视频在线| 国产精品视频午夜| 一区二区国产精品视频| 成人欧美一区二区三区在线| 岛国精品视频在线播放| 欧美精品免费在线| 成人欧美在线视频| 91av在线国产| 91国内在线视频| 日韩欧美国产成人| 国产精品尤物福利片在线观看| 亚洲欧美日韩一区在线| 色综久久综合桃花网| 中文字幕亚洲精品| 欧美在线视频网站| 亚洲精品电影在线观看| 欧美激情精品久久久久久| 国语自产精品视频在线看| 色综合亚洲精品激情狠狠| 欧美日韩亚洲系列| 91九色精品视频| 欧美在线免费视频| 久久久亚洲天堂| 国产精品福利小视频| 精品电影在线观看| 欧美野外wwwxxx| 久久久精品美女| 成人深夜直播免费观看| 国内揄拍国内精品| 国产美女搞久久| 欧美在线免费观看| 欧美激情精品久久久久久| 视频在线观看一区二区| 日韩欧美成人免费视频| 91亚洲精品在线| 亚洲激情在线视频| 成人黄色av网| 久久精品国产电影| 91久久久久久久久久久| 欧美日韩国产一中文字不卡| 国精产品一区一区三区有限在线| 亚洲综合在线播放| 欧美不卡视频一区发布| 欧美成人黄色小视频| 黄色精品在线看| 欧美大成色www永久网站婷| 亚洲无线码在线一区观看| 亚洲最大成人在线| 538国产精品一区二区在线| 亚洲一区二区三区sesese| 日韩中文字在线| 欧美激情视频网址| 欧美午夜片欧美片在线观看| 精品一区二区三区四区| 日韩欧美国产免费播放| 乱亲女秽乱长久久久| 欧美日韩国产精品一区二区不卡中文| 中文精品99久久国产香蕉| 欧美日韩国产成人在线观看| 成人在线播放av| 成人在线小视频| 亚洲自拍偷拍在线| 久久久国产精品免费| 国产成人精品久久二区二区| 日韩欧美在线中文字幕| 亚洲国产成人一区| 国产一区二区在线免费视频| 伊人久久久久久久久久| 久久精品夜夜夜夜夜久久| 欧美日韩午夜剧场| 欧美一级在线亚洲天堂| 亚洲色图偷窥自拍| 日韩一区二区福利| 亚洲欧美一区二区三区久久| 欧美在线观看网站| 97视频免费在线观看| 精品久久久999| 欧美肥老妇视频| 亚洲视频自拍偷拍| 69av视频在线播放| 91沈先生在线观看| 国内精品一区二区三区四区| 欧美午夜片欧美片在线观看| 亚洲激情电影中文字幕| 热久久99这里有精品| 国产精品观看在线亚洲人成网| 久久久久久亚洲精品| 日韩美女中文字幕| 亚洲一区999| 国产精品久久久久久久久久久久久久| 久久视频在线直播| 久久视频精品在线| 国产精品在线看| 精品久久久精品| 欧美日韩亚洲国产一区| 久久香蕉国产线看观看av| 久久久精品亚洲| 欧美精品激情blacked18| 亚洲影视中文字幕| 国产精品露脸自拍| 亚洲人成电影网站色www| 国产精品久久久| 亚洲a∨日韩av高清在线观看| 欧美一级黑人aaaaaaa做受| 亚洲黄色av女优在线观看| 亚洲美女免费精品视频在线观看| 久久久精品一区二区|