Qt訊號與槽的機制講解

2021-09-29 18:13:47 字數 2109 閱讀 4151

訊號與槽(signal & slot)是 qt 程式設計的基礎,也是 qt 的一大創新。因為有了訊號與槽的程式設計機制,在 qt 中處理介面各個元件的互動操作時變得更加直觀和簡單。

gui 程式設計的主要內容就是對介面上各元件的訊號的響應,只需要知道什麼情況下發射哪些訊號,合理地去響應和處理這些訊號就可以了。

訊號與槽關聯是用 qobject::connect() 函式實現的,其基本格式是:

qobject::connect(sender, signal(signal()), receiver, slot(slot()));
connect() 是 qobject 類的乙個靜態函式,而 qobject 是所有 qt 類的基類,在實際呼叫時可以忽略前面的限定符,所以可以直接寫為:

connect(sender, signal(signal()), receiver, slot(slot()));
其中,sender 是發射訊號的物件的名稱,signal() 是訊號名稱。訊號可以看做是特殊的函式,需要帶括號,有引數時還需要指明引數。receiver 是接收訊號的物件名稱,slot() 是槽函式的名稱,需要帶括號,有引數時還需要指明引數。

signal 和 slot 是 qt 的巨集,用於指明訊號和槽,並將它們的引數轉換為相應的字串。例如 ui_widget.h 檔案中,在 setupui() 函式中有如下的語句:

qobject::connect(btnclose, signal(clicked()), widget, slot(close()));
其作用就是將 btnclose 按鈕的 clicked() 訊號與窗體(widget)的槽函式 close() 相關聯,這樣,當單擊 btnclose 按鈕(就是介面上的「close」按鈕)時,就會執行 widget 的 close() 槽函式。

connect(spinnum, signal(valuechanged(int)), this, slot(addfun(int));

connect(spinnum, signal(valuechanged(int)), this, slot(updatestatus(int));

這是當乙個物件 spinnum 的數值發生變化時,所在窗體有兩個槽進行響應,乙個 addfun()用於計算,乙個 updatestatus() 用於更新狀態。

當乙個訊號與多個槽函式關聯時,槽函式按照建立連線時的順序依次執行。

當訊號和槽函式帶有引數時,在 connect()函式裡,要寫明引數的型別,但可以不寫引數名稱。

多個訊號可以連線同乙個槽,例如讓三個選擇顏色的 radiobutton的clicked() 訊號關聯到相同的乙個自定義槽函式 settextfontcolor()。

connect(ui->rbtnblue,signal(clicked()),this,slot(settextfontcolor()));

connect(ui->rbtnred,signal(clicked()),this,slot(settextfontcolor()));

connect(ui->rbtnblack,signal(clicked()),this,slot(settextfontcolor()));

這樣,當任何乙個 radiobutton 被單擊時,都會執行 settextfontcolor() 函式。

乙個訊號可以連線另外乙個訊號,例如:

connect(spinnum, signal(valuechanged(int)), this, signal (refreshinfo(int));
這樣,當乙個訊號發射時,也會發射另外乙個訊號,實現某些特殊的功能。

嚴格的情況下,訊號與槽的引數個數和型別需要一致,至少訊號的引數不能少於槽的引數。如果不匹配,會出現編譯錯誤或執行錯誤。

在使用訊號與槽的類中,必須在類的定義中加入巨集 q_object。

當乙個訊號被發射時,與其關聯的槽函式通常被立即執行,就像正常呼叫乙個函式一樣。只有當訊號關聯的所有槽函式執行完畢後,才會執行發射訊號處後面的**。

訊號與槽機制是 qt gui 程式設計的基礎,使用訊號與槽機制可以比較容易地將訊號與響應**關聯起來。

QT訊號與槽機制

qt訊號與槽 posted on 2010 04 08 15 37 feisky 訊號與槽作為qt的核心機制在qt程式設計中有著廣泛的應用,本文介紹了訊號與槽的一些基本概念 元物件工具以及在實際使用過程中應注意的一些問題。qt是乙個跨平台的c gui應用構架,它提供了豐富的視窗部件集,具有物件導向 ...

Qt 訊號與槽機制

下部分 來自於我自己新增了傳遞引數的部分 ifndef my object define my object include define my slots define my signals protected define my emit class myobject struct metaob...

Qt的訊號與槽機制

qt使用訊號與槽機制進行物件間的通訊。當某個物件的狀態發生變化時,該物件會觸發 乙個訊號。該訊號和另外一些物件的槽函式繫結,訊號的觸發將導致執行這些槽函式,這些 槽函式將處理第乙個物件狀態的變化,完成物件之間的通訊。a 訊號與槽的定義 a 乙個類的訊號函式應該滿足以下語法約束。1 函式返回值是voi...