1. 程式人生 > >QT訊號與

QT訊號與

下面舉叫外賣的例子來說明什麼是訊號和槽,比如: ①比如到午飯時間了,某宅男餓了——由不餓到餓,是一個狀態的變化,肚子餓了就相當於是一個訊號。誰都會餓的,每個人都可以發這類訊號。注意訊號只是一個空想,沒 東西吃是填不飽肚子的。餓了怎麼辦,準備叫外賣。 ②街上餐館很多,都希望多做點生意,送外賣也是常事——做好飯送外賣就是槽函式。這個送外賣功能,餐館一般都是有的,但誰來買送給誰,這個暫時定不了。如果餐館飯 做得好,但沒人吃那也是不行的。 ③食客餓了(訊號),餐館有送飯服務(槽函式),二者怎麼溝通呢?通常我們都是打電話,Qt 把這個過程叫訊號和槽的關聯(connect)。雖然我們每次叫外賣都要撥一長串號碼,但 Qt 關聯比我們打電話方便,它只需要將訊號關聯具體某家餐館外賣服務一次,以後都是自動撥號的。 Qt 物件的訊號和槽關聯好之後,源頭只需要發個訊號,叫一聲“我餓了”,connect 函式會自動撥號,餐館立刻就送餐過來。訊號和槽函式在進行關聯的時候,二者的引數需要一致,不能我叫西紅柿雞蛋的蓋澆飯,餐館給送蘭州拉麵,那是不行的。多個物件的訊號和槽函式在引數匹配的情況下,它 們之間的關聯可以是一對一,一對多(某吃貨可以同時叫多個餐館的飯),多對一(多個人可以同時訂某家餐館的飯),所以關聯是比較自由的。 槽函式的宣告與類的成員函式宣告一樣,使用方式也一樣,唯一不一樣的就是在宣告訪問許可權時需要加slots

識別符號,如public slots: void FoodIsComing();將 pushButton 的訊號 clicked (即“我餓了”)與 主視窗的槽函式 FoodIsComing 關聯起來,實現自動撥號叫外賣。Qt 通過 QObject::​connect 函式完成訊號和槽函式的關聯,因為主視窗最頂層的基類是 QObject,所以我們下面程式碼不需要加 QObject:: 字首。

connect 函式第一個引數是發訊號的源頭物件指標,按鈕物件的指標就是 ui->pushButton,ui 是為窗體構建介面的輔助類物件指標,我們在窗體設計介面拖的控制元件物件都存在這個 ui 指向的物件裡。ui->pushButton 就指向我們之前拖的按鈕物件。因為通過設計模式拖的控制元件全部是以指標型別訪問的,所以以後說到窗體裡的控制元件,一般都是說它的指標名字。 第二個引數用 SIGNAL 巨集包裹,裡面是按鈕物件的訊號 clicked() ,訊號的宣告和成員函式類似,但必須放在 signals 宣告段落。上面沒看到 signals 宣告段落是因為 QPushButton 類的物件自帶這個訊號,不需要我們來定義。 第三個引數是接收物件的指標,也就是服務提供方,是槽函式所在物件的指標,我們上面用的 this 指標就是主窗體自己。 第四個引數是接收物件裡的槽函式,並用 SLOT 巨集封裝起來。

connect 函式意義是非常清晰的,將源頭和源頭的訊號,關聯到接收端和接收端的槽函式。注意源頭和接收端必須是存在的實體物件指標,不能是野指標。connect 函式必須放在 ui->setupUi 之後,否則控制元件指標是未定義的野指標,那種關聯必然失敗,會導致程式崩潰。

Widget::Widget(QWidget *parent) : 
	QWidget(parent), ui(new Ui::Widget)
{    ui->setupUi(this);
    //新增關聯程式碼,必須放在 setupUi 函式之後    
    connect(ui->pushButton,
SIGNAL(clicked()), this, SLOT(FoodIsComing())); }