本文適合于對(duì)Qt Quick有基本了解的讀者。首先回答一個(gè)比較常會(huì)被問(wèn)到的問(wèn)題:什么是QML,它與Quick的關(guān)系是什么?
Qt Quick是Qt User Interface Creation Kit的縮寫(xiě),而QML是Qt 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 ”。
- //main.qml
- import Qt 4.7
- import MyItems 1.0
- Item {
- width: 300; height: 200
- MyButton {
- //注意:x, y, width, height是繼承自item的屬性,無(wú)需再自定義的item中實(shí)現(xiàn)
- x: 50; y: 50
- width: 200; height: 100
- color: "gray" //自定義屬性
- onMySignals: dosth //自定義信號(hào)mySignals
- MouseArea {
- anchors.fill: parent
- onClicked: parent.myColor() // 調(diào)用C++定義的方法myColor
- }
- }
- }
- //main.qml
- import Qt 4.7
- import MyItems 1.0
- Item {
- width: 300; height: 200
- MyButton {
- //注意:x, y, width, height是繼承自item的屬性,無(wú)需再自定義的item中實(shí)現(xiàn)
- x: 50; y: 50
- width: 200; height: 100
- color: "gray" //自定義屬性
- onMySignals: dosth //自定義信號(hào)mySignals
- MouseArea {
- anchors.fill: parent
- onClicked: parent.myColor() // 調(diào)用C++定義的方法myColor
- }
- }
- }
為了能夠上述qml代碼工作,需要為在Qt C++代碼中注冊(cè)MyButton及其所屬的模塊,對(duì)應(yīng)的main.cpp代碼如下:
- #include <QtGui/QApplication>
- #include "qmlapplicationviewer.h"
- int main(int argc, char *argv[])
- {
- QApplication app(argc, argv);
- QmlApplicationViewer viewer;
- // MyButtonItem是與QML中MyButton相對(duì)應(yīng)的C++實(shí)現(xiàn)的類(lèi)名稱(chēng)
- // 1,0是版本信息;MyItems是MyButton所屬的模塊名稱(chēng)
- qmlRegisterType<MyButtonItem>("MyItems", 1, 0, "MyButton ");
- viewer.setOrientation(QmlApplicationViewer::Auto);
- viewer.setMainQmlFile(QLatin1String("qml/untitled/main.qml"));
- viewer.show();
- return app.exec();
- }
- #include <QtGui/QApplication>
- #include "qmlapplicationviewer.h"
- int main(int argc, char *argv[])
- {
- QApplication app(argc, argv);
- QmlApplicationViewer viewer;
- // MyButtonItem是與QML中MyButton相對(duì)應(yīng)的C++實(shí)現(xiàn)的類(lèi)名稱(chēng)
- // 1,0是版本信息;MyItems是MyButton所屬的模塊名稱(chēng)
- qmlRegisterType<MyButtonItem>("MyItems", 1, 0, "MyButton ");
- viewer.setOrientation(QmlApplicationViewer::Auto);
- viewer.setMainQmlFile(QLatin1String("qml/untitled/main.qml"));
- viewer.show();
- return app.exec();
- }
上面我們?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)
- class MyButtonItem : public QDeclarativeItem
- {
- Q_OBJECT
- Q_PROPERTY(QColor color READ color WRITE setColor NOTIFY colorChanged)
- signals:
- void colorChanged();
- void mySignals();
- public:
- MyButtonItem(QDeclarativeItem *parent = 0);
- void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
- QWidget *widget = 0);
- public:
- const QColor &color() const;
- void setColor(const QColor &newColor);
- Q_INVOKABLE QColor myColor() const;
- // Alternatives for myColor to be called from QML
- //public slots
- //QColor myColor() const;
- private:
- QColor m_color;
- };
原始作者地址http://blog.csdn.net/changsheng230
小結(jié):關(guān)于詳解QML與C++混合編程使用的內(nèi)容介紹完了,希望本文對(duì)你有所幫助!