第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)。
- 一步一步學(xué)Spring Boot 2:微服務(wù)項(xiàng)目實(shí)戰(zhàn)
- FuelPHP Application Development Blueprints
- Node.js 10實(shí)戰(zhàn)
- Mastering RStudio:Develop,Communicate,and Collaborate with R
- Julia高性能科學(xué)計(jì)算(第2版)
- Django 3.0入門與實(shí)踐
- Mastering Concurrency Programming with Java 9(Second Edition)
- Simulation for Data Science with R
- 物聯(lián)網(wǎng)系統(tǒng)架構(gòu)設(shè)計(jì)與邊緣計(jì)算(原書(shū)第2版)
- Software Development on the SAP HANA Platform
- Python硬件編程實(shí)戰(zhàn)
- Sitecore Cookbook for Developers
- Android技術(shù)內(nèi)幕(系統(tǒng)卷)
- Clojure Data Structures and Algorithms Cookbook
- HTML5 Canvas核心技術(shù):圖形、動(dòng)畫(huà)與游戲開(kāi)發(fā)