• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 319, comments - 22, trackbacks - 0, articles - 11
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            詳解QML與C++混合編程使用

            Posted on 2011-08-04 22:31 RTY 閱讀(930) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 轉(zhuǎn)載隨筆QML

            本文適合于對(duì)Qt Quick有基本了解的讀者。首先回答一個(gè)比較常會(huì)被問(wèn)到的問(wèn)題:什么是QML,它與Quick的關(guān)系是什么?

            Qt QuickQt User Interface Creation Kit的縮寫(xiě),而QMLQt Quick最重要的組成部分,Qt Quick結(jié)合了如下技術(shù):

            組件集合,其中大部分是關(guān)于圖形界面的

            基于JavaScript陳述性語(yǔ)言:QML (Qt Meta-Object Language的縮寫(xiě))

            用于管理組件并與組件交互的C++ API - QtDeclarative模塊

            言歸正傳:通過(guò)Qt Creator,我們可以輕松生成一個(gè)Qt Quick的應(yīng)用工程,從而為QML生成應(yīng)用程序框架。具體操作詳見(jiàn):創(chuàng)建qt quick (qml) 應(yīng)用程序。

            C++與QML的交互是通過(guò)注冊(cè)C++對(duì)象給QML環(huán)境得以實(shí)現(xiàn)的:

            C++實(shí)現(xiàn)中,非可視化的型別均為QObject的子類(lèi),可視化的類(lèi)型均為QDeclarativeItem的子類(lèi)。注意:QDeclarativeItem等同于QML的Item類(lèi)。

            如果用戶想要定義自己的型別,做法如下:

            在C++中,實(shí)現(xiàn)派生于QObject或QDeclarativeItem的子類(lèi),它是新定義item的實(shí)體對(duì)象;

            在C++中,將1中實(shí)現(xiàn)的新item類(lèi)型注冊(cè)給QML;

            在QML中,導(dǎo)入含有1中定義的新item的模塊;

            在QML中,向使用標(biāo)準(zhǔn)的item一樣使用新定義的item

            現(xiàn)舉例說(shuō)明,我們現(xiàn)嘗試使用用Qt C++實(shí)現(xiàn)的MyButton對(duì)象(如下qml代碼),它有自己的屬性、方法以及信號(hào)的handler。用法如下(它與使用其它標(biāo)準(zhǔn)的QML item一樣),所需要做的是 需要導(dǎo)入包含MyButton的對(duì)應(yīng)模塊名稱(chēng)及其版本“MyItems 1.0 ”。

            1. //main.qml
            2. import Qt 4.7
            3. import MyItems 1.0
            4. Item {
            5. width: 300; height: 200
            6. MyButton {
            7. //注意:x, y, width, height是繼承自item的屬性,無(wú)需再自定義的item中實(shí)現(xiàn)
            8. x: 50; y: 50
            9. width: 200; height: 100
            10. color: "gray" //自定義屬性
            11. onMySignals: dosth //自定義信號(hào)mySignals
            12. MouseArea {
            13. anchors.fill: parent
            14. onClicked: parent.myColor() // 調(diào)用C++定義的方法myColor
            15. }
            16. }
            17. }
            18. //main.qml
            19. import Qt 4.7
            20. import MyItems 1.0
            21. Item {
            22. width: 300; height: 200
            23. MyButton {
            24. //注意:x, y, width, height是繼承自item的屬性,無(wú)需再自定義的item中實(shí)現(xiàn)
            25. x: 50; y: 50
            26. width: 200; height: 100
            27. color: "gray" //自定義屬性
            28. onMySignals: dosth //自定義信號(hào)mySignals
            29. MouseArea {
            30. anchors.fill: parent
            31. onClicked: parent.myColor() // 調(diào)用C++定義的方法myColor
            32. }
            33. }
            34. }

            為了能夠上述qml代碼工作,需要為在Qt C++代碼中注冊(cè)MyButton及其所屬的模塊,對(duì)應(yīng)的main.cpp代碼如下:

            1. #include <QtGui/QApplication>
            2. #include "qmlapplicationviewer.h"
            3. int main(int argc, char *argv[])
            4. {
            5. QApplication app(argc, argv);
            6. QmlApplicationViewer viewer;
            7. // MyButtonItem是與QML中MyButton相對(duì)應(yīng)的C++實(shí)現(xiàn)的類(lèi)名稱(chēng)
            8. // 1,0是版本信息;MyItems是MyButton所屬的模塊名稱(chēng)
            9. qmlRegisterType<MyButtonItem>("MyItems", 1, 0, "MyButton ");
            10. viewer.setOrientation(QmlApplicationViewer::Auto);
            11. viewer.setMainQmlFile(QLatin1String("qml/untitled/main.qml"));
            12. viewer.show();
            13. return app.exec();
            14. }
            15. #include <QtGui/QApplication>
            16. #include "qmlapplicationviewer.h"
            17. int main(int argc, char *argv[])
            18. {
            19. QApplication app(argc, argv);
            20. QmlApplicationViewer viewer;
            21. // MyButtonItem是與QML中MyButton相對(duì)應(yīng)的C++實(shí)現(xiàn)的類(lèi)名稱(chēng)
            22. // 1,0是版本信息;MyItems是MyButton所屬的模塊名稱(chēng)
            23. qmlRegisterType<MyButtonItem>("MyItems", 1, 0, "MyButton ");
            24. viewer.setOrientation(QmlApplicationViewer::Auto);
            25. viewer.setMainQmlFile(QLatin1String("qml/untitled/main.qml"));
            26. viewer.show();
            27. return app.exec();
            28. }

            上面我們?cè)赒ML中MyButton對(duì)象,有自己的屬性、方法以及信號(hào)的handler,其實(shí)現(xiàn)均來(lái)自Qt C++。Qt C++需要作以下工作:首先要定義 QML中MyButton相對(duì)應(yīng)的C++實(shí)現(xiàn)MyButtonItem,它必須繼承自QDeclarativeItem

            為了讓MyButton對(duì)象能夠使用其Color屬性,MyButtonItem類(lèi)需要利用QT的PROPERTY系統(tǒng),為Moc聲明其屬性

            為了讓MyButton對(duì)象能夠使用其myColor方法,MyButtonItem類(lèi)需要聲明該方法,并標(biāo)記為Q_INVOKABLE (另外一種解決方案是將myColor聲明為槽。

            為了讓MyButton對(duì)象能夠接受到C++所emit的信號(hào),并在onMySignals,MyButtonItem類(lèi)需要聲明mySignals信號(hào)

            1. class MyButtonItem : public QDeclarativeItem
            2. {
            3. Q_OBJECT
            4. Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
            5. signals:
            6. void colorChanged();
            7. void mySignals();
            8. public:
            9. MyButtonItem(QDeclarativeItem *parent = 0);
            10. void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
            11. QWidget *widget = 0);
            12. public:
            13. const QColor &color() const;
            14. void setColor(const QColor &newColor);
            15. Q_INVOKABLE QColor myColor() const;
            16. // Alternatives for myColor to be called from QML
            17. //public slots
            18. //QColor myColor() const;
            19. private:
            20. QColor m_color;
            21. };

            原始作者地址http://blog.csdn.net/changsheng230

            小結(jié):關(guān)于詳解QMLC++混合編程使用的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!

            久久精品人人做人人爽电影蜜月 | 久久亚洲AV无码精品色午夜 | 99久久久精品免费观看国产| 久久99精品久久久久久噜噜| 久久99国产精品尤物| 亚洲AV无码成人网站久久精品大| 亚洲Av无码国产情品久久| 久久精品?ⅴ无码中文字幕| 亚洲国产二区三区久久| 国产精品熟女福利久久AV | 精品久久久久久国产91| 国产精品女同久久久久电影院| 欧洲成人午夜精品无码区久久| 久久人人爽人人爽人人片AV不| 国产精品视频久久| 国内精品久久久久久久coent| 久久99精品免费一区二区| 人人狠狠综合久久亚洲高清| 无码人妻久久一区二区三区蜜桃| 亚洲欧洲日产国码无码久久99| 久久精品国产亚洲AV高清热 | 婷婷久久五月天| 久久久久久综合网天天| 久久久无码一区二区三区| 日韩一区二区久久久久久| 久久人人爽人人精品视频| 久久国产色av免费看| 99久久精品九九亚洲精品| 久久这里只精品99re66| 国产精品久久久久影院色| 欧美无乱码久久久免费午夜一区二区三区中文字幕| 久久午夜福利电影| 久久久久久国产精品免费无码| 久久精品免费网站网| 97热久久免费频精品99| 久久婷婷人人澡人人| 99久久精品费精品国产一区二区| 久久久无码精品午夜| 久久精品国产99国产精偷| 久久www免费人成看片| 久久精品国产亚洲精品|