QML→C++的對接
信號槽機制
大部分情況下,用戶對QML的操作返干,需要調用對應的C++函數(shù)進行處理兴枯。QML上的操作,可以通過信號的方式被C++中的槽函數(shù)所捕獲矩欠。
可以對任意一個元素添加信號:
Button {
id: pointRest8
x: 8
y: 20
width: 90
height: 43
text: qsTr("工作?休息")
objectName: "pointChangeState"
signal changeState(int num)
onClicked: { changeState(8); }
}
這個按鈕元素就添加上了一個名為changeState 的信號财剖,參數(shù)是一個整形。
當發(fā)生單擊事件時癌淮,調用這個信號函數(shù)躺坟,就相當于emit了這個信號。為了使這個信號能被捕獲乳蓄,我們需要在C++中鏈接信號槽咪橙。
鏈接一個QML中的信號到C++的槽函數(shù)需要三步(在C++中)
- 得到整個QML文檔的根節(jié)點指針(前文)
- 通過findChild()的方式,找到這個發(fā)送這個信號的元素(Object* 指針)
- 通過QObject::connect()來鏈接
例如,在QML文檔中美侦,有這樣一個元素:
ComboBox {
id: comboBox
objectName: "comboBox"
x: 155
y: 11
currentIndex: 0
signal: activated(int)//信號
}
注意店诗,只有這個元素有 objectName 屬性,才能被 findChild() 找到音榜。
在C++代碼中,我們可以這樣寫:
Object* getObject;
getObject= rootObject->findChild<QObject*>("comboBox");
QObject::connect(getObject, SIGNAL(activated(int)), &myControl, SLOT(setStrategy(int)));
其中<code>setStrategy(int)</code>是一個事先定義好的槽函數(shù)捧弃。
這樣赠叼,當combobox發(fā)送了一個信號,我們的C++代碼就可以捕獲這個信號违霞,并根據(jù)傳遞的參數(shù)進行處理嘴办。
如何定義一個槽函數(shù)
只需要這樣:
class controlCenter : public QObject
{
Q_OBJECT
public slots:
void setStrategy(int num);
};
有兩個必不可少的:
- Q_OBJECT宏
- 聲明成 public slots
C++→QML的對接
相比之下,從C++代碼中調用QML中的函數(shù)會相對容易买鸽。
首先涧郊,假設QML中我定義了一個函數(shù):
ComboBox {
id: comboBox
objectName: "comboBox"
x: 155
y: 11
currentIndex: 0
function get_x(num){
return this.x;
}
}
看起來很像js...
那么,我們需要調用這個函數(shù)的時候眼五,首先需要找到這個函數(shù)是屬于哪個元素的:
Object* getObject;
getObject= rootObject->findChild<QObject*>("comboBox");
之后妆艘,通過QMetaObject::invokeMethod()來調用
int t = 5;
QVariant p(t)
QMetaObject::invokeMethod(getObject, "get_x", Q_ARG(QVariant, p);//注意參數(shù)
上面似乎多了點東西,但是由于調用 QML 函數(shù)的時候看幼,參數(shù)必須是 QVariant 類型批旺,所以無論什么C++類型,我們都可以給他包一層诵姜,然后再傳參汽煮。
其中,第一個參數(shù)是我們拿到的QML節(jié)點指針棚唆,第二個參數(shù)是函數(shù)名暇赤,后面幾個參數(shù)可以是Q_ARG(type, name)或者 Q_RETURNARG(type, name),總之和正常的調用有一些區(qū)別宵凌。