Qt5開發學習總結(一)——信號與槽機制

介紹

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倍。原因主要是

  • 需要定位接受對象
  • 安全地遍歷所有的關聯(如一信號對多槽)
  • 多線程時信號可能需要排隊等待
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章