一、信號和槽概述
? ? ? ? 在Qt中,用戶和控件的每次交互過程稱為一個事件。比如"用戶點擊按鈕"是一個事件,"用戶關閉窗口"也是一個事件。每個事件都會發出一個信號,例如用戶點擊按鈕會發出"按鈕被點擊"的信號,用戶關閉窗口會發出"窗口被關閉"的信號。
????????Qt中的所有控件都具有接收信號的能力,一個控件還可以接收多個不同的信號。對于接收到的每個信號,控件都會做出相應的響應動作。例如,關閉按鈕所在的窗口接收到"按鈕被點擊"的信號后,會做出"關閉自己"的響應動作;再比如輸入框自己接收到"輸入框被點擊"的信號后,會做出"顯示閃爍的光標,等待用戶輸入數據"的響應動作。在Qt中,對信號做出的響應動作就稱之為槽。
????????信號和槽是Qt特有的消息傳輸機制,它能將相互獨立的控件關聯起來。比如,"按鈕"和"窗口"本身是兩個獨立的控件,點擊"按鈕"并不會對"窗口"造成任何影響。通過信號和槽機制,可以將"按鈕"和"窗口"關聯起來,實現"點擊按鈕會使窗口關閉"的效果。
二、信號和槽的本質
1.信號的本質
????????信號是由于用戶對窗口或控件進行了某些操作,導致窗口或控件產生了某個特定事件,這時Qt對應的窗口類會發出某個信號,以此對用戶的操作做出反應。因此,信號的本質就是事件。例如:按鈕單擊、雙擊;窗口刷新;鼠標移動、按下、釋放;鍵盤輸入……
注意:
(1)我們對哪個窗口進行操作,哪個窗口就可以捕捉到這些被觸發的事件。
(2)對于使用者來說觸發了一個事件我們就可以得到Qt框架給我們發出的某個特定信號。
(3)信號的呈現形式就是函數,也就是說某個事件產生了,Qt框架就會調用某個對應的信號函數,通知使用者。
(4)在Qt中信號的發出者是某個實例化的類對象。
2.槽的本質
????????槽(Slot)就是對信號響應的函數。槽就是一個函數,與一般的C++函數是一樣的,可以定義在類的任何位置( public、protected或private),可以具有任何參數,可以被重載,也可以被直接調用(但是不能有默認參數)。槽函數與一般的函數不同的是:槽函數可以與一個信號關聯,當信號被發射時,關聯的槽函數被自動執行。
注意:
(1)信號和槽機制底層是通過函數間的相互調用實現的。每個信號都可以用函數來表示,稱為信號函數;每個槽也可以用函數表示,稱為槽函數。例如:"按鈕被按下"這個信號可以用clicked()函數表示,"窗口關閉"這個槽可以用close()函數表示,假如使用信號和槽機制-實現:"點擊按鈕會關閉窗口”的功能,其實就是clicked()函數調用close()函數的效果。
(2)信號函數和槽函數通常位于某個類中,和普通的成員函數相比,它們的特別之處在于:
? ? ? ? ①信號函數用signals關鍵字修飾,槽函數用public slots、protected slots或者private slots修飾。signals和slots是Qt在C++的基礎上擴展的關鍵字,專門用來指明信號函數和槽函數;
? ? ? ? ②信號函數只需要聲明,不需要定義(實現),而槽函數需要定義(實現)。
????????信號函數的定義是Qt自動在編譯程序之前生成的,編寫Qt應用程序的程序猿無需關注。這種自動生成代碼的機制稱為元編程(Meta Programming),這種操作在很多場景中都能見到。
三、信號和槽的使用
1.連接信號和槽connect
????????在Qt中,QObject類提供了?個靜態成員函數connect(),該函數專??來關聯指定的信號函數和槽函數。
QObject類:
????????QObject類是Qt內置的父類,Qt中提供的很多類都是直接或者間接繼承自QObject類。
connect()函數原型:
connect (const QObject *sender,const char * signal ,const QObject * receiver ,const char * method ,Qt::ConnectionType type = Qt::AutoConnection )
connect()函數參數說明:
- sender:信號的發送者;
- signal:發送的信號(信號函數);
- receiver:信號的接收者;
- method:接收信號的槽函數;
- type:用于指定關聯方式,默認為AutoConnection;
代碼示例:在窗口中添加一個按鈕,點擊按鈕時窗口關閉
2.查看內置信號和槽
? ? ? ? 系統內置的信號和槽,通常都是通過官方QT幫助文檔來查詢,例如查詢按鈕的信號:
(1)在幫助文檔中輸入QPushButton來進行搜索
(2)結果發現并沒有找到有關信號的內容,那么繼續搜索其父類QAbstractButton中進行尋找
(3)其中就能找到Signals相關內容,同理如果父類中沒有找到相關信息,可以繼續向父類的父類一直向上尋找
3.連接信號與槽方式
3.1通過connect手動連接
? ? ? ? 我們也可以去定義一個自己的槽函數來完成自己想要的操作,然后通過connect函數將對應控件的對應信號與槽函數進行綁定即可。
3.2 通過命名規則自動連接
? ? ? ? ①右鍵控件,選擇轉到槽,會自動彈出窗口顯示可以選擇的信號:
????????
? ? ? ? ②選擇對應的信號后,會自動跳轉到代碼編輯頁面,且已自動創建好槽函數:
? ? ? ? 我們此時只需要直接在函數中,編寫我們所需要的實現即可。
? ? ? ? 此時可能會發現沒有connect函數進行綁定,但卻能實現對應操作,是因為QT還可以通過函數名進行自動綁定槽函數,只需要我們在定義槽函數名時,滿足自動綁定的規則即可。
槽函數的命名規則為 on_XXX_SSS :
1、以"on"開頭,中間使?下劃線連接起來;
2、"XXX"表?的是對象名(控件的objectName屬性);
3、"SSS"表?的是對應的信號。
例如:"on_pushButton_clicked()",pushButton代表的是對象名,clicked是對應的信號
注意事項:
1.如果是代碼手動實現,更建議顯示的使用connect進行連接,不要依賴命名規則自動連接
2.如果是ui布局使用,根據實際運用情況對功能沒有影響的情況下,可以選擇自動連接方式