官术网_书友最值得收藏!

第3章 信號(hào)和槽

3.1 基本概念

在第2章中,我們已經(jīng)接觸了信號(hào)和槽,當(dāng)用戶觸發(fā)了一個(gè)菜單動(dòng)作時(shí),就產(chǎn)生了一個(gè)菜單觸發(fā)信號(hào),主窗口用相應(yīng)的操作響應(yīng)信號(hào),執(zhí)行相應(yīng)的操作,該響應(yīng)操作即為槽。在Qt中,Qt的部件已經(jīng)預(yù)定義了很多信號(hào)和槽,信號(hào)如triggered()等,槽包括close()、hide()、show()等,用戶也可以在類中增加新的信號(hào)和槽,以便實(shí)現(xiàn)特定的功能。

Qt中還有一種響應(yīng)機(jī)制: 事件。Qt中的事件主要來(lái)自底層的窗口系統(tǒng),如鼠標(biāo)、鍵盤、定時(shí)器、網(wǎng)絡(luò)等,對(duì)事件的響應(yīng)一般采用重載類的成員函數(shù)來(lái)實(shí)現(xiàn),例如前面我們實(shí)現(xiàn)的mouseMoveEvent、TimerEvent等。從實(shí)現(xiàn)上,事件比信號(hào)和槽要更底層一些,例如單擊鼠標(biāo)首先產(chǎn)生mousePressEvent,再在部件中產(chǎn)生triggered信號(hào)。

信號(hào)和槽遵循C++的基本語(yǔ)法,在定義信號(hào)和槽時(shí),只需添加關(guān)鍵字slots和signals即可,例如:

…
public slots:
     void setValue(int value);
 signals:
     void valueChanged(int newValue);
…

要實(shí)現(xiàn)信號(hào)和槽的關(guān)聯(lián),用connect操作實(shí)現(xiàn),例如:

connect(aboutAct, SIGNAL(triggered()), this, SLOT(about()));

即把觸發(fā)“關(guān)于”菜單項(xiàng)的信號(hào)傳遞給窗口的“關(guān)于”操作,實(shí)現(xiàn)對(duì)菜單的響應(yīng)。

信號(hào)和槽是Qt對(duì)象的重要特征,使用的信號(hào)和槽必須是QObject的子類,否則無(wú)法使用信號(hào)和槽來(lái)建立關(guān)聯(lián)。信號(hào)和槽是類型安全的,只要信號(hào)的參數(shù)在順序上是大于槽的參數(shù),即可建立匹配,在響應(yīng)的時(shí)候,系統(tǒng)自動(dòng)匹配滿足槽的參數(shù),放棄多余的參數(shù)。圖3-1給出了信號(hào)和槽關(guān)聯(lián)的示意,在Qt中,信號(hào)和槽也是松耦合的,可以各自在類中定義和實(shí)現(xiàn),彼此在連接時(shí)進(jìn)行參數(shù)匹配之外,沒(méi)有任何相關(guān)性。一個(gè)信號(hào)可以觸發(fā)多個(gè)槽,多個(gè)信號(hào)也可以連接至一個(gè)槽。需要注意的是,在槽中發(fā)射信號(hào)不要產(chǎn)生死循環(huán)。

圖3-1 信號(hào)和槽關(guān)聯(lián)示意圖

先不著急學(xué)習(xí)怎么用C++編寫信號(hào)和槽的代碼,既然信號(hào)和槽主要用于窗口部件間的聯(lián)系,那么我們還是從Qt Designer入手,用實(shí)例理解信號(hào)和槽的實(shí)現(xiàn)。

主站蜘蛛池模板: 垫江县| 沙坪坝区| 扬州市| 察雅县| 绍兴县| 金沙县| 奎屯市| 桦南县| 库伦旗| 平度市| 鱼台县| 仁寿县| 新兴县| 宜城市| 同德县| 定陶县| 略阳县| 广灵县| 兴海县| 桦南县| 文山县| 衢州市| 富锦市| 新建县| 大洼县| 上栗县| 瓮安县| 太和县| 旬阳县| 阿鲁科尔沁旗| 工布江达县| 民县| 库尔勒市| 安远县| 尚义县| 泸溪县| 车险| 措勤县| 东至县| 蚌埠市| 确山县|