Qt5開發學習總結(一)——訊號與槽機制
阿新 • • 發佈:2019-01-03
介紹
Qt提供了訊號與槽機制用於完成介面操作的響應,是完成任意兩個Qt物件之間通訊的機制。其中,訊號會在某個特定情況或動作下被觸發,槽是等同與接受並處理訊號的函式。
例如,若要將一個視窗部件的變化情況通知給另一個視窗部件,則一個視窗部件傳送訊號,另一個視窗部件的槽接受訊號並接受相應操作,既可實現兩個視窗部件之間的通訊。
每個Qt物件都包含若干個預定義的訊號和槽,當某一個特定事件發生時,一個訊號被髮送,與訊號相關聯的槽則會響應訊號並完成相應的處理。當一個類被繼承時,該類的訊號與槽也同時被繼承,也可以根據自定義訊號與槽。
1.訊號與槽的連線方式
1.一個訊號可以與另一個訊號相連:
connect(Object1,SIGNAL(signal1),Object2,SIGNAL(signal1));
表示Object1的訊號1傳送可以觸發Object2的訊號1傳送。
2.同一個訊號可以與多個槽相連:
connect(Object1,SIGNAL(signal2),Object2,SLOT(slot2);
connect(Object1,SIGNAL(signal3),Object3,SLOT(slot1);
3.同一個槽可以相應多個訊號:
connect(Object1,SIGNAL(signal2),Object2,SIGNAL (slot2);
connect(Object3,SIGNAL(signal2),Object2,SIGNAL(slot2);
常用連線方式
connect(Object1,SIGNAL(signal),Object2,SLOT(slot));
SIGNAL()和SLOT()定義的兩個巨集,它們返回引數的C語言風格字串(const char*)。因此下面這樣兩種是等同的:
connect(button,SIGNAL( clicked() ),this,SLOT( showArea() );
connect(button,"clicked()" ,this,"showArea()" );
2.訊號與槽的優點
1.型別安全
訊號引數型別和引數個數與槽引數型別和個數相同,不過槽的引數個數可以少於訊號引數個數,缺少的引數必須是訊號引數的最後一個或幾個引數。如果不滿足上述條件就會報錯。
2.鬆散耦合
在建立後,激發訊號的Qt物件不需要知道哪個物件的哪個槽關聯到了訊號,同樣,物件的槽也不知道是哪個槽關聯了自己,而一旦關聯訊號和槽,Qt就保證合適的槽得到了呼叫,即使關聯的物件被刪除,應用程式也不會關閉。
一個類若要支援訊號與槽,就必須從QObject或QObject的子類繼承,注意,Qt的訊號與槽機制不支援對模版的使用。
3.訊號與槽機制的效率
由於增加了靈活性,與大名鼎鼎的回撥函式相比,訊號與槽的執行機制速度有些慢,通常,通過傳遞一個訊號來呼叫槽函式將會比直接呼叫非虛擬函式慢10倍。原因主要是
- 需要定位接受物件
- 安全地遍歷所有的關聯(如一訊號對多槽)
- 多執行緒時訊號可能需要排隊等待