信號(SIGNAL)與槽(SLOT)

信號與槽的作用

Qt提供了信號和槽的機制用於完成界面操作的響應,是完成任意兩個Qt對象之間的通信機制。

信號與槽的原理

信號會在某個特定的情況和動作下被觸發,比如Click一個按鈕操作,就會使這個按鈕的click信號觸發,而槽是接收並處理這些信號的函數,click信號會被傳遞到所有“註冊”(在這裏使用註冊這個詞語來描述來自於C#)了這個信號的控件,然後由這個控件的函數進行響應,按鈕本身不會關心誰“註冊”了這個信號,這個信號傳遞給了誰。
信號和槽可以繼承,也可以自定義。關鍵字是signals和slots,必須私有。

信號和槽的連接方式

  1. 一個信號與另一個信號相連
    connect(Object1.SIGNAL(signal1),Object2,SIGNAL(signal2));
    表示Object1的信號signal1可以觸發Object2的信號signal2;
  2. 同一個信號可以與多個槽相連
    connect(Object1.SIGNAL(signal1),Object2,SLOT(slot1));
    connect(Object1.SIGNAL(signal1),Object3,SLOT(slot2));
  3. 同一個槽可以響應多個信號
    connect(Object1.SIGNAL(signal1),Object3,SLOT(slot1));
    connect(Object2.SIGNAL(signal2),Object3,SLOT(slot1));

注意


  1. SIGNAL()和()SLOT()是Qt定義的兩個宏,他們返回其參數的C語言風格的字符串(const *char),因此下面的兩個語句是相同的:
    connect(Object2.SIGNAL(clicked()),Object3,SLOT(functionA()));
    connect(Object2."clicked()",Object3,"functionA()");
  2. 在connect()函數的的官方幫助文檔這樣寫道:

Note that the signal and slots parameters must not contain any variable names, only the type. E.g. the following would not work and return false:
//WRONG
QObject::connect(scrollBar,SIGNAL(valueChanged(int value)),label, SLOT(setNum(int value)));

也就是說,不論是信號還是槽函數,在SIGNAL()和SLOT()中使用時,參數只能包含變量類型,不能包含變量名,上面的寫法是錯誤的。
3. 需要關聯的信號和槽的簽名必須是等同的
函數簽名在C#中是這樣定義的:通過函數的名稱和參數定義函數的簽名1
但是在C++中,應該是函數名稱、函數參數類型、參數個數定義函數簽名。
也就是說,信號的參數類型和參數個數與接收該信號的槽函數的參數類型和個數相同。不過,一個槽的參數個數是可以少於信號的參數個數的,但缺少的參數必須是信號參數的最後一個或幾個參數,如果簽名不符,編譯器就會報錯。


  1. 《C#入門經典》清華大學出版社(第5版)p115
發佈了25 篇原創文章 · 獲贊 20 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章