QT訊號和槽

2021-09-07 15:08:09 字數 2869 閱讀 4690

qt訊號和槽

**********==

訊號和槽是一種高階介面,應用於物件之間的通訊,它是 qt 的核心特性。要正確的處理訊號和槽,必須借助乙個稱為 moc(meta object compiler)的 qt 工具,該工具是乙個 c++ 預處理程式,它為高層次的事件處理自動生成所需要的附加**。 訊號和槽能攜帶任意數量和任意型別的引數。我們可以將很多訊號與單個的槽進行連線,也可以將單個的訊號與很多的槽進行連線,(當這個訊號被發射時,這些槽將會乙個接乙個地 執行,但是它們執行的順序將會是隨機的、不確定的,我們不能人為地指定哪個先執行、哪個後執行。)甚至於將乙個訊號與另外乙個訊號相連線,這時無論第乙個訊號什麼時候發射系統都將立刻發射第二個訊號。總之,訊號與槽構造了乙個強大的部件程式設計機制。

訊號(signals)

訊號只需要在標頭檔案中做宣告,不需要在cpp中實現。放在qt自定義關鍵字signals下,在此之前一定要加上q_object巨集!

在程式設計中,一般使用的是控制項內部定義好的訊號。如:qtreeview類下的signals:

1 q_signals:

2 void pressed(const qmodelindex &index);

3 void clicked(const qmodelindex &index);

4 void doubleclicked(const qmodelindex &index);

56 void activated(const qmodelindex &index);

7 void entered(const qmodelindex &index);

8 void viewportentered();

也可以自定義訊號,並通過emit在**中發射訊號。

emit setvisiable(id,item->checkstate());

槽(slots)

public q_slots:

virtual void reset();

virtual void setrootindex(const qmodelindex &index);

virtual void doitemslayout();

virtual void selectall();

void edit(const qmodelindex &index);

void clearselection();

void setcurrentindex(const qmodelindex &index);

void scrolltotop();

void scrolltobottom();

void update(const qmodelindex &index);

槽和普通的c++成員函式幾乎是一樣的(可以是虛函式,可以被過載,可以是public slots、protected slots、private slots,可以被其他c++成員函式直接呼叫;唯一不同的是:槽還可以和訊號連線在一起,在這種情況下,訊號被發射時,會自動呼叫這個槽。)槽不需要訊號傳過來的引數時,可以不要引數;但槽一旦要引數,其引數個數,型別,順序必須要和對應的訊號保持一致。另外,槽的引數不能有預設值。

關聯訊號和槽(connect)

可以使用qobject類的靜態成員函式connect來建立訊號的槽的關聯

static bool connect(const qobject *sender, const qmetamethod &signal,

const qobject *receiver, const qmetamethod &method,

qt::connectiontype type = qt::autoconnection);

具體的呼叫為:connect(scenetree,signal(setvisiable(int,qt::checkstate)),this,slot(setvisiable(int,qt::checkstate)));

其中sender和receiver為qobject類物件的指標; signal巨集和slot巨集將訊號的槽轉換成字串。

注:在connect函式中訊號函式和槽函式若有引數,只能寫出引數型別,而不能也將變數名寫出;否則,連線會失敗!

斷開訊號和槽(disconnect)

當訊號和槽沒有必要繼續保持連線時,可以通過呼叫disconnect來斷開它們。

bool qobject::disconnect (const qobject * sender, const char * signal,  const object * receiver, const char * slot) [static]

有三種情況必須使用 disconnect() 函式:

(1)斷開與某個物件相關聯的任何物件。

disconnect(sender, 0, 0, 0) ;

//或者

sender->disconnect();

(2)斷開與某個特定訊號的任何關聯。

disconnect(sender, signal(signal()), 0, 0);

//或者

sender->disconnect(signal(signal()));

(3)斷開兩個物件之間的關聯。

1 disconnect(sender, 0, receiver, 0);

23 //或者45 sender->disconnect(receiver);

Qt訊號和槽

qt將訊號和槽關聯起來的connect使用時需要注意帶相應的引數,否則會出現訊號發出後不能呼叫槽的問題,例子如下 發出訊號的宣告 signals void receiveddata uchar dat,uint len 接收訊號的槽宣告 private slots void getdata ucha...

Qt 訊號和槽

函式原型 qobject connect const qobject sender,const char signal,const qobject receiver,const char method,qt connectiontype type qt autoconnection 通常使用的con...

Qt 訊號和槽

訊號的宣告 signals void statechanged int nnewval 訊號函式滿足以下約束 gui視窗控制項 例如按鈕 標籤 列表 編輯框等等 都預先定義好了若干訊號,比如單擊按鈕就會發出 clicked 訊號,還有諸如雙擊 doubleclicked 進入 entered 按下 ...