QT之訊號與槽基礎

2021-10-05 10:06:07 字數 2788 閱讀 7441

一、幾個概念簡述:

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

(2)訊號(signal):就是在特定情況下被發射的事件,例如pushbutton 最常見的訊號就是滑鼠單擊時發射的 clicked() 訊號,乙個 combobox 最常見的訊號是選擇的列表項變化時發射的 currentindexchanged() 訊號。

(3)槽(slot):就是對訊號響應的函式。槽就是乙個函式,與一般的c++函式是一樣的,可以定義在類的任何部分(public、private 或 protected),可以具有任何引數,也可以被直接呼叫。槽函式與一般的函式不同的是:槽函式可以與乙個訊號關聯,當訊號被發射時,關聯的槽函式被自動執行。

在進行gui(圖形使用者介面)程式設計時,設計介面上存在的不同元件之間的訊號響應,需要知道在哪些情況下觸發哪些訊號,設計響應的函式去處理和響應訊號即可。

二、qt中訊號與槽函式的關聯

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

qobject::connect(sender, signal(signal()), receiver, slot(slot()));

可以忽略前面的限定符,所以可以直接寫為:

connect(sender, signal(signal()), receiver, slot(slot()));

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

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

qobject::connect(btnclose, signal(clicked()), widget, slot(close()));

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

三、qt訊號與槽函式使用時的一些規則

(1)乙個訊號可以連線多個槽函式,如下**

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

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

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

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

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

(2)多個訊號可以連線同乙個槽,例如乙個例項:讓三個選擇顏色的 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() 函式。

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

connect(spinnum, signal(valuechanged(int)), this, signal (refreshinfo(int));

這樣,當乙個訊號觸發時,也會觸發另外乙個訊號,實現某些特殊的功能。

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

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

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

自定義訊號槽需要注意的事項

傳送者和接收者都需要是 qobject 的子類(當然,槽函式是全域性函式、lambda 表示式等無需接收者的時候除外);

使用 signals 標記訊號函式,訊號是乙個函式宣告,返回 void,不需要實

現函式**;

槽函式是普通的成員函式,作為成員函式,會受到 public、private、protected 的影響;

使用 emit 在恰當的位置傳送訊號;

使用 qobject::connect()函式連線訊號和槽。

任何成員函式、static 函式、全域性函式和 lambda 表示式都可以作為槽函式

QT之訊號與槽

當乙個物件的狀態發生變化時,通過訊號的方式通知其他物件,其他物件通過執行相應的槽函式來響應該訊號。訊號與槽是qt提供的任意兩個 qobject 物件之間的通訊機制,常用來完成介面操作的響應。訊號 訊號 是可以看作是乙個請求或者乙個動作的標誌。訊號的理解 1 訊號是屬於物件的 2 當物件的狀態改變時,...

QT入門之訊號與槽

訊號與槽的關聯使用 qobject connect 函式實現的,其基本格式是 qobject connect sender,signal signal receiver,slog slot connect 是 qobject類的乙個靜態函式,而qobject是所有qt類的基類,在實際呼叫時可以忽略前...

qt 槽與訊號

槽就是乙個可以被呼叫處理特定訊號的函式 乙個小的qt類如下 class foo public qobject public slots void setvalue int signals void valuechanged int private int val qt中的元物件系統是用來處理物件間通...