QT的訊號和槽機制

2022-08-11 18:54:12 字數 2258 閱讀 1271

訊號和槽是qt程式設計的重要部分

它提供了物件間的通訊機制。迅速,型別安全,健壯,完全物件導向的用c++來實現的機制。

我們在用**函式機制把某段響應**和乙個按鈕的動作相關聯的時候,通常把響應**寫成函式,然後把這個函式的位址指標傳給按鈕,當那個按鈕被單擊時,這個函式就會被執行。對於這種方式,以前的開發包不能夠確保**函式被執行時所傳遞進來的函式引數就是正確的型別,因此容易造成程序崩潰。另外乙個問題是,**這種方式緊緊地繫結了圖形使用者介面的功能元素,因而很難把開發進行獨立的分類。

qt的訊號和槽機制是不同的,qt的視窗在事件發生後會激發訊號。例如,乙個按鈕被單擊時會激發乙個clicked訊號,我們通過建立乙個函式(稱作乙個槽),然後呼叫connect()函式把這個槽和乙個訊號連線起來,這樣就完成了乙個事件和響應**的連線。訊號和槽機制並不要求類之間互相知道細節,這樣就可以相對容易的開發出**可高重用的類。訊號和槽機制是型別安全的,它以警告的方式報告型別錯誤,而不會使系統崩潰。例如,如果乙個退出按鈕的clicked()訊號被連線到了乙個應用的退出函式——槽quit(),那麼乙個使用者單擊退出鍵將使應用程式中止執行。上述的連線過程用**寫出來就是這樣:

//signal()訊號00

//slot()槽

我們可以在qt程式執行的過程增加或減少訊號和槽的連線,訊號和槽的實現拓展了c++的語法,完全利用了c++物件導向的特徵。訊號和槽可以被過載或重寫,它門可以被定義為類的公有,私有或保護成員。

訊號:當物件的內部狀態發生改變,訊號(signal)就會被傳送。只有定義了乙個訊號的類和它的子類才能傳送這個訊號

如果兩個不同的類對同乙個訊號感興趣,可以將這個訊號和這個兩個物件連線起來。當訊號被傳送後,它所連線的槽會被立刻執行,就像乙個普通函式被呼叫一樣。訊號和槽機制完全不依賴任何一種圖形使用者介面的事件迴路。當所有的槽都返回後emit也將返回。

如果幾個槽被連線到乙個訊號,當訊號被傳送後,它所連線的槽會按任意順序乙個接著乙個執行 ( qt5後,在訊號發射後,槽函式會按照鏈結順序執行)。

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

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

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

connect(sender,signal(signal),receiver,slot(slot))//connect()函式把槽和訊號連線在一起

//sender,receiver是qobject物件指標,signal,slot是不帶引數的函式原型

//signal(),slot()的作用是把它門轉化成字串

//signal(signal)訊號

//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 gui 程式設計的基礎,使用訊號與槽機制可以比較容易地將訊號與響應**關聯起來。

QT的訊號和槽機制

為了解開程式介面中不同物件的耦合,qt提供了訊號和槽機制用於介面操作的響應,是完成任意兩個qt物件之間的通訊機制。qt物件包含許多預定義的訊號和槽。訊號 在某個特定情況或者動作下被觸發而發出的訊息 槽 接收並處理訊號的訊息的函式。當乙個特定的事件發生時,乙個訊號被傳送,與訊號相關聯的槽會響應訊號並完...

Qt訊號槽機制

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

qt 訊號槽機制

訊號 signals void startgetdatathread void sendpointer mainwindow 宣告乙個訊號要使用signals關鍵字。在signals前面不能使用public private和protected等限定符,因為只有定義該訊號的類及其子類才可以發射該訊號。...