Qt Quick 學習筆記(二) QML與C++雙向對接

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ū)別宵凌。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末鞋囊,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瞎惫,更是在濱河造成了極大的恐慌失暴,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件微饥,死亡現(xiàn)場離奇詭異逗扒,居然都是意外死亡,警方通過查閱死者的電腦和手機欠橘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門矩肩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事黍檩〔媾郏” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵刽酱,是天一觀的道長喳逛。 經(jīng)常有香客問我,道長棵里,這世上最難降的妖魔是什么润文? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮殿怜,結果婚禮上典蝌,老公的妹妹穿的比我還像新娘。我一直安慰自己头谜,他們只是感情好骏掀,可當我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柱告,像睡著了一般截驮。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上际度,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天侧纯,我揣著相機與錄音,去河邊找鬼甲脏。 笑死眶熬,一個胖子當著我的面吹牛,可吹牛的內容都是我干的块请。 我是一名探鬼主播娜氏,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼墩新!你這毒婦竟也來了贸弥?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤海渊,失蹤者是張志新(化名)和其女友劉穎绵疲,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體臣疑,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡盔憨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了讯沈。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郁岩。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出问慎,到底是詐尸還是另有隱情萍摊,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布如叼,位于F島的核電站冰木,受9級特大地震影響,放射性物質發(fā)生泄漏笼恰。R本人自食惡果不足惜踊沸,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挖腰。 院中可真熱鬧,春花似錦练湿、人聲如沸猴仑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽辽俗。三九已至,卻和暖如春篡诽,著一層夾襖步出監(jiān)牢的瞬間崖飘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工杈女, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留朱浴,地道東北人。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓达椰,卻偏偏與公主長得像翰蠢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子啰劲,可洞房花燭夜當晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內容