函式原型
qmetaobject::connection qobject::connect(const qobject* sender, constchar* signal, const qobject* reciver, const
char* method, qt::connectiontype type=qt::autoconnection)
建立乙個從傳送方指定訊號到接收方方法的鏈結,返回鏈結的控制代碼,可以用於斷開鏈結。可以通過轉換為bool值來判斷connecton是否有效。
傳送方的訊號和接收方的方法(槽)都是以字元指標的形式傳遞進來的,可以通過兩個巨集signal(), slot()將指定的訊號和槽轉換為字元指標形式。
例如:
qlabel *label = newqlabel;
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檔案下面的建構函式中...