目錄
1 -> 信號和槽概述
1.1 -> 信號的本質
1.2 -> 槽的本質
2 -> 信號與槽的連接方式
2.1 -> 一對一
2.2 -> 一對多
2.3 -> 多對一
3 -> 小結
1 -> 信號和槽概述
在 Qt 中,用戶和控件的每次交互過程稱為一個事件。比如 “用戶點擊按鈕” 是一個事件,“用戶關閉窗口也是一個事件”。,每個事件都會發出一個信號,例如用戶點擊按鈕會發出 “按鈕被點擊” 的信號,用戶關閉窗口會發出 “窗口被關閉” 的信號。
Qt 中的所有控件都具有接收信號的能力,一個控件還可以接收多個不同的信號。對于接收到的每個信號,控件都會做出相應的響應動作。例如,按鈕所在的窗口接收到 “按鈕被點擊” 的信號后,會做出“關閉自己”的相應動作;再比如輸入框自己接收到 “輸入框被點擊” 的信號后,會做出 “顯示閃爍的光標,等待用戶輸入數據” 的響應動作。在 Qt 中,對信號做出的響應動作就稱之為槽。
信號和槽是 Qt 特有的消息傳輸機制,它能將互相獨立的控件關聯起來、比如,“按鈕” 和 “窗口” 本身是兩個獨立的控件,點擊 “按鈕” 并不會對 “窗口” 造成任何影響。通過信號和槽機制,可以將 “按鈕” 和 “窗口” 關聯起來,實現 “點擊按鈕會使窗口關閉” 的效果。
1.1 -> 信號的本質
信號是由于用戶對窗口或控件進行了某些操作,導致窗口或控件產生了某個特定事件,這時 Qt 對應的窗口類會發出某個信號,以此對用戶的操作做出反應。因此,信號的本質就是事件。如:
- 按鈕單擊、雙擊
- 窗口刷新
- 鼠標移動、鼠標按下、鼠標釋放
- 鍵盤輸入
那么問題來了,在 Qt 中信號是通過什么形式呈現給使用者呢?
- 我們對哪個窗口進行操作,哪個窗口就可以捕捉到這些被觸發的事件
- 對于使用者來說,觸發了一個事件我們就可以得到 Qt 框架給我們發出的某個特定信號
- 信號的呈現形式就是函數,也就是說某個事件產生了,Qt 框架就會調用某個對應的信號函數,通知使用者。
在 Qt 中信號的發出者是某個實例化的類對象。
1.2 -> 槽的本質
?槽(Slot)就是對信號響應的函數。槽就是一個函數,與一般的 C++ 函數是一樣的,可以定義在類的任何位置(public、protected 或 private),可以具有任何參數,可以被重載,也可以被直接調用(但是不能有默認參數)。槽函數與一般的函數不同的是:槽函數可以與一個信號關聯,當信號被發射時,關聯的槽函數被自動執行。
說明
- 信號和槽機制底層是通過函數間的相互調用實現的。每個信號都可以用函數來表示,稱為信號函數;每個槽也可以用函數表示,稱為槽函數。例如:“按鈕被按下” 這個信號可以用 clicked() 函數表示,“關閉窗口” 這個槽可以用 close() 函數表示,假如使用信號和槽機制實現:“點擊按鈕會關閉窗口” 的功能,其實就是 clicked() 函數調用 close() 函數的效果。
- 信號函數和槽函數通常位于某個類中,和普通的成員函數相比,它們的特別之處在于:
- 信號函數用 signals 關鍵字修飾,槽函數用 public slots、protected slots 或者 private slots 修飾。signals 和 slots 是 Qt 在 C++ 的基礎上擴展的關鍵字,專門用來指明信號函數和槽函數;
- 信號函數只需要聲明,不需要定義(實現),而槽函數需要定義(實現)。
注意
信號函數的定義是 Qt 自動在編譯程序之前生成的。編寫 Qt 應用程序時無需關注。
這種自動生成代碼的機制稱為 元編程(Meta Programming)。這種操作在很多場景都能見到。
2 -> 信號與槽的連接方式
2.1 -> 一對一
主要有兩種形式,分別是:一個信號連接一個槽 和 一個信號連接一個信號。
一. 一個信號連接一個槽
示例:
1. 在 “widget.h” 中聲明信號和槽以及信號發射函數。
?2. 在 “widget.cpp” 中實現槽函數,信號發射函數以及連接信號和槽。
二. 一個信號連接另一個信號
示例:
在上述示例基礎上,在 “widget.cpp” 文件中添加如下代碼:
2.2 -> 一對多
一個信號連接多個槽
示例:
1. 在 “widget.h” 頭文件中聲明一個信號和三個槽。?
2. 在 “widget.cpp” 文件中實現槽函數以及連接信號和槽。
2.3 -> 多對一
多個信號連接一個槽函數
示例:
1. 在 “widget.h” 頭文件中聲明兩個信號以及一個槽。
2. 在 “widget.cpp” 文件中實現槽函數以及連接信號和槽。
3 -> 小結
一、核心概念
-
信號本質:用戶操作控件產生的事件(如點擊按鈕、關閉窗口)觸發Qt框架自動調用的信號函數,是事件在代碼層的表現形式
-
槽本質:響應信號的成員函數,具有普通函數特性(可重載、帶參數),但需用
slots
關鍵字修飾 -
核心機制:通過信號函數調用槽函數實現對象間解耦通信(如點擊按鈕觸發窗口關閉)
二、連接方式
-
一對一連接
-
信號→槽:基礎連接(如按鈕點擊觸發處理函數)
-
信號→信號:實現信號級聯傳遞(如按鈕A點擊觸發按鈕B的信號)
-
-
一對多連接
-
單信號→多槽:信號觸發時多個槽函數按連接順序執行
-
-
多對一連接
-
多信號→單槽:不同信號觸發同一處理邏輯(如多個按鈕共用響應函數)
-
三、關鍵特性
-
信號只需聲明(Qt自動生成實現),槽需完整定義
-
通過
QObject::connect()
建立連接關系 -
支持靈活的事件響應鏈設計(信號級聯、多路響應)
-
實現控件間解耦交互(如按鈕與窗口獨立對象通過信號槽關聯)
四、核心價值
提供安全的事件驅動通信框架,使GUI組件能獨立開發并通過信號槽動態組合功能,大幅提升Qt應用的模塊化程度和可維護性。
感謝各位大佬支持!!!
互三啦!!!