簡單說下我自己對qml與c++的交互的理解流程:
1.界面交互,很多新手可能會寫qt界面或者qml界面,但想要把qml與c++結合起來就一臉蒙逼了。首先我提供個簡單的方法實現qml和c++的界面交互,首先引入幾個重要的頭文件,當然在項目文件中需要加QT+= quickwidgets才能引用以下頭文件
#include <QQuickWidget>
#include <QQuickView>
#include <QQmlContext>
Widget::Widget(QWidget *parent) :
QWidget(parent)
{
qmlWidget = new QQuickWidget(this);
qmlWidget->rootContext()->setContextProperty("View",this);
qmlWidget->setSource(QUrl(QStringLiteral("qrc:/Staute.qml")));
}
在構造函數裏添加三句代碼就讓Widget界面和qml界面綁定在一起了,簡單吧。溫馨提示:不要忘了在析構函數中delete掉qmlWidget哦,否則重複運行程序會出現異常結束現象
簡單敘述下個人拙見,第一句代碼不用說是qml界面,第二句是爲了把Widget界面用View表示,使得當前界面的屬性能傳入qml界面,簡單說就是如果在qml文件中需要用到this的屬性,使用View.屬性就可以了。
第三句代碼想必各位都理解,就是加載qml文檔。把widge顯示後界面就是你在qml文件編輯的界面了。需要注意的是qml文檔要移到資源文件中去。
如果你想在qml裏面使用Widget的函數或者是成員的話類似View.width;點後面加成員屬性或者函數就可以了。需要注意的有幾點:
想要將一個類或對象導出到qml中必須滿足以下條件
1.從QObject或QObject的派生類繼承
2.使用Q_OBJECT宏
Q_INVOKABLE宏
在定義一個類的成員函數時使用Q_INVOKABLE宏來修飾就可以讓該方法被元對象系統調用,即可使用View.function這種方式訪問c++函數。宏必須放在返回值類型前(最前面)
如果是槽函數則可以省略,因爲槽函數本身能被元對象系統調用。
Q_PROPERTY宏用來定義可通過元對象系統訪問的屬性,通過它定義的屬性可以在QML中訪問、修改還可以在屬性變化時發射特定的信號。這裏給一個簡單的示例:
Q_PROPERTY(int taskid READ returnTaskid WRITE setTaskid NOTIFY tidChange)
public:
int returnTaskid(){return taskid;}
void setTaskid(int id){taskid = id;emit tidChange();}
signals:
void tidChange();
private:
int taskid;
順序是成員屬性、成員屬性的get方法、成員屬性的set方法、成員屬性數據變化時發出的信號
本人太懶就粗略介紹下,閒暇時再更新。