Qt5的訊號和槽函式

斷水客發表於2020-09-24

1、 Qt5的訊號和槽函式

Qt Creator的幫助手冊中對訊號和槽函式(signals&slots)描述如下:

Signals and slots are used for communication between objects. The signals and slots mechanism is a central feature of Qt and probably the part that differs most from the features provided by other frameworks. Signals and slots are made possible by Qt’s meta-object system.
訊號和槽函式用於物件間的通訊,是Qt和其他開發平臺相區別的最主要的特性

Qt5作為c++的GUI開發類庫,其最具代表性的特點就是訊號和槽,這兩者類似於中斷和中斷處理函式呼叫的回撥(callback)函式,但具體實現在應用層,並且使用起來較後者更為方便。
在這裡插入圖片描述

2、訊號和槽函式(signals&slots)的用處

如前所述,signals&slots可以用於物件間的通訊。實際上常用於對GUI窗體上各種事件的及時處理,譬如:

a:文字框

文字框的內容被修改後會有一個名為valueChangedsignal,我們如果希望在文字框的內容被修改後把內容儲存到檔案裡,就可以將程式設計為“用一個slots函式(假設為funcA)和valueChanged這個訊號相關聯,每個valueChanged訊號被髮出的時候,都呼叫這個funcA將文字框中的內容儲存到指定的檔案裡”。

b:按鍵

每次某個按鍵按下後都呼叫一個函式funcB,假設按鍵按下後發出一個訊號signalB,這個時候funcB就是slots,signalB就是signals

c:自定義signal和slots

假設有兩個class,分別為學生Student和老師Teacher。希望每次老師拍桌子的時候學生就坐端正。用函式描述就是每次Teacher類的物件呼叫“拍桌子”這個函式的時候,所有的學生類的物件就呼叫“坐端正”這個函式。

在上面這個例子中,拍桌子函式被呼叫就會發出signals,學生物件將呼叫坐端正這個slots來響應

3、關聯訊號和槽函式

通常在接收訊號並呼叫槽函式的物件的類的建構函式(constructor)中,呼叫connect函式實現訊號與槽的關聯。

connect()函式的一種參數列如下所示:

connect(sender, &SenderObject::signalFuncton, this, &ReceiverObject::slotsFunction);

sender:傳送訊號的物件
&SenderObject::signalFuncton:訊號函式指標
&ReceiverObject::slotsFunction:槽函式指標

4、宣告訊號和槽函式

用程式碼實現2.c老師和學生的例子

老師的訊號:

class Teacher{
	...
signals:
	void BeatTheDeskSignal();
	...

};

注:訊號必須是無返回值的函式。


學生的slots:

class Student{
	...
private:
	Teacher _teaA;
	...
private slots:
	void SitDown(int val);
	...

};

學生的connect:

Student::Student()
{
	...
	
	
	connect(_teaA,&Teacher::BeatTheDeskSignal,this,&Student::SitDown);
	...
}

5、發射訊號

signals在發出後由slots響應,使用關鍵字emit發射signals,譬如可以在Teacher中新增一個函式“拍桌子”,用來發射BeatTheDeskSignal這個signasl:

void Teacher::BeatTheDesk()
{
	emit BeatTheDeskSignal();
}

至此,每次Teacher的物件呼叫BeatTheDesk,就會發射一個BeatTheDeskSignal訊號,對應的Student物件就會呼叫SitDown函式來響應。

相關文章