Qt訊號與槽的connect

2022-08-11 11:48:18 字數 2060 閱讀 6527

函式原型

qmetaobject::connection qobject::connect(const qobject* sender, const

char* signal, const qobject* reciver, const

char* method, qt::connectiontype type=qt::autoconnection)

建立乙個從傳送方指定訊號到接收方方法的鏈結,返回鏈結的控制代碼,可以用於斷開鏈結。可以通過轉換為bool值來判斷connecton是否有效。

傳送方的訊號和接收方的方法(槽)都是以字元指標的形式傳遞進來的,可以通過兩個巨集signal(), slot()將指定的訊號和槽轉換為字元指標形式。

例如:

qlabel *label = new

qlabel;

qscrollbar *scrollbar = new

qscrollbar;

qobject::connect(scrollbar, signal(valuechanged(

int)),

label, slot(setnum(

int)));

訊號和槽的引數中只能指定引數型別,不可以包含引數名字,以下的方法就是錯誤的:

//

wrong

qobject::connect(scrollbar, signal(valuechanged(int

value)),

label, slot(setnum(

int value)));

乙個訊號可以連線到多個訊號和槽,多個訊號也可以連線到乙個槽。如果乙個訊號連線到多個槽,當訊號產生時,槽被啟用的順序與連線被建立的順序相同。

可以通過disconnect()函式來斷開連線。

connect方法的最後乙個引數型別是connectiontype,這是乙個列舉型別,包含以下字段:字段值

描述qt::autoconnection

0(預設值)如果訊號的發射與接收方在不同執行緒,則與qt::queuedconnection行為一致;否則,直接呼叫槽,行為與qt::directconnection一致。連線型別在訊號被發射時確定

qt::directconnection

1訊號被發射時,立即呼叫槽函式

qt::queuedconnection

2當接收方的訊息迴圈得到控制權時,槽函式才會被呼叫;槽函式在接收方的執行緒中執行

qt::blockingqueuedconnection

3與qt::queuedconnection行為一致,但是當前執行緒是阻塞的。這種連線型別只能被用接收方與傳送方處於不同執行緒的情形下。

qt::uniqueconnection

0x80

這個標誌可以與上面三個中的任意乙個組合。當此標誌被設定時,如果connection已經存在(同乙個訊號連線到同乙個物件的同乙個槽),則connect函式會失敗

在使用queuedconnection時,引數必須要在qt的元物件系統中註冊,否則會返回錯誤資訊:

qobject::connect: cannot queue arguments of type 'mytype' (mytype是你自定義的型別)

因為qt需要複製引數到後台訊息佇列中儲存,所以在使用自定義連線型別時需要呼叫qregistermetatype()函式來註冊。

看 到這裡,做過win32開發的人,就會覺得很熟悉了。是的,就是postmessage, sendmessage。qt中connection的directconnection型別對應了 sendmessagetimeout,queuedconnection型別對應了 postmessage,blockingqueuedconnection型別對應了sendmessage。在做win32開發時,需要註冊視窗類, 系統才會為其維護乙個後台訊息佇列,只有具有後台訊息佇列的物件才可以處理postmessage,sendmessage訊息,而qt中的 qregistermetatype()函式,毫無疑問就是充當了這個角色。

win32 sdk是以訊息的形式來響應使用者事件的,無論怎麼變,怎麼改名詞,訊號,槽等等,「訊息」這個核心是改變不了的。

Qt訊號與槽connect 函式

qmetaobject connection qobject connect const qobject sender,傳送方物件 const char signal,傳送物件中的事件訊號 const qobject receiver,接收方物件 const char method,接收物件中的要執...

QT訊號槽connect函式

使用qt開發時,通常使用connect函式只傳遞四個引數 connect sender,signal signal receiver,slot slot 所以我們有可能認為該函式就只有四個引數,但實際上是有第五個引數的,只是通常該函式已經給第五個引數賦值了而已,我們所使用的是預設值 sender和r...

QT之Connect訊號與槽的連線函式

一 不用寫connect qt訊號和槽函式的命名是有規則的,組成為on 物件名 訊號,以按鈕為例,如果物件名為pushbutton,在你在寫槽函式的時候按照這種規則,則 在標頭檔案中新增 private slots void on pushbutton clicked 在.cpp檔案下面的建構函式中...