Qt的訊號與槽機制

2021-07-25 09:02:57 字數 2072 閱讀 7232

qt使用訊號與槽機制進行物件間的通訊。當某個物件的狀態發生變化時,該物件會觸發

乙個訊號。該訊號和另外一些物件的槽函式繫結,訊號的觸發將導致執行這些槽函式,這些

槽函式將處理第乙個物件狀態的變化,完成物件之間的通訊。

(a)訊號與槽的定義:

a) 乙個類的訊號函式應該滿足以下語法約束。

(1)函式返回值是void型別,因為觸發訊號函式的目的是執行與其繫結的槽函式,無

需訊號函式返回任何值。

(2)程式設計師只能宣告、不能實現訊號函式,因為qt的moc會實現它,無需程式設計師關心。

(3)只能以emit關鍵字「呼叫」訊號函式,不能使用普通的呼叫方式。

(4)訊號函式被moc自動設定為protected,因而只有包含乙個訊號函式那個類及其派生

類能夠觸發該訊號函式。

(5)訊號函式的引數個數、型別由程式設計師自由設定,這些引數的職責是封裝類的狀態信

息,並將這些資訊傳遞給槽函式。

(6)只有qobject及其派生類才可以定義訊號函式。

b) 乙個類的槽函式應該滿足以下語法約束。

(1)函式返回值是void型別,因為訊號與槽機制是單向的:訊號函式被觸發後,與其

繫結的槽函式會被執行,但不要求槽函式返回任何執行結果。  

(2)乙個類的槽函式可以如同其他成員函式一樣被正常呼叫。

(3)乙個類的槽函式可以是public, protected以及private,這些關鍵字的含義依舊,也

就是說,它們能夠控制其他類是否能夠以正常的方式呼叫乙個槽函式。但是,這些關鍵字對

函式不起作用,也就是說,我們可以將protected甚至private的槽函式和乙個訊號函式

定。當該訊號函式被觸發時,甚至privat。的槽函式也會被執行。從某種意義上講,qt的信

與槽機制破壞了c+十的訪問控制規則,但是這種機制帶來的靈活性遠勝於可能導致的問題。

(4)只有qobject及其派生類才可以定義槽函式。

。qobject的靜態成員函式connect()繫結乙個訊號函式與乙個槽函式,它的使用形式為:

connect(sender, signal(signal_function(...), receiver, slot(slot_function(...)), qt::connectiontype type = qt::autoconnection);

其中sender及receiver都是指向qobject物件的指標,前者指向觸發訊號的那個物件,後者

指向處理訊號的那個物件,兩者分別被稱為「傳送者」以及「接收者」。signal function以及

slot function分別是這兩個物件中定義的訊號函式、槽函式,兩者的引數列表只需包含引數

型別,無需包含引數名字。一般情況下,兩個函式的原型應該完全相同。少數情況下,訊號

函式的引數可以多於槽函式的引數,當槽函式被執行時,多餘的引數將被忽略。最後乙個參

數具有型別qt::connectiontype,預設值為qt::autoconnection,表示當訊號函式被觸發時,

如果傳送者和接收者位於同乙個執行緒,槽函式會被立即執行。如果兩者位於不同的執行緒,當

我們可以呼叫

qobject的另乙個靜態成員函式disconnect()斷開乙個訊號函式與乙個槽函式,它的使用形式為:

disconnect(sender, signal(signal_function(...), receiver, slot(slot_function(...)) );

當乙個qobject物件被析構時,與之相關的所有

連線都會被斷開。因此,通常情況下程式猿沒有必要顯式地呼叫disconnect。

說明:connect函式的最後乙個引數是具有列舉型別

qt::connectiontype。

下表為該列舉型別中定義的列舉常量。列舉常量一般都是被包含在名字空間qt中的。

directconnection以及blockingqueuedconnection型別,只要當乙個訊號函式繫結的所有槽函式被執行完畢之後,emit語句後面的語句才能被執行。各槽函式的執行順序與他們被繫結的順序相同。

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訊號槽機制

c 的rtti機制功能有限 qt提供了元物件系統,使用該系統的基類qobject所建立和派生的類,可以再執行期獲取該物件的類名 父 類名,成員變數資訊,成員函式資訊,進而實現訊號槽機制。c 模擬 類定義檔案 object.h 1.ifndef db object 2.define db object...