QT訊號槽connect函式詳解
使用QT開發時,通常使用connect函式只傳遞四個引數:
connect(Sender,SIGNAL(signal),Receiver,SLOT(slot));
所以我們有可能認為該函式就只有四個引數,但實際上是有第五個引數的,只是通常該函式已經給第五個引數賦值了而已,我們所使用的是預設值。
實際上connect函式應該是如下形式:
connect(sender,SIGNAL(signal),receiver,SLOT(slot),Qt::DirectConnection);
Qt::DirectConnection引數 | 引數含義 |
Qt::AutoConnection | 預設值,使用這個值則連線型別會在訊號傳送時決定。如果接收者和傳送者在同一個執行緒,則自動使用Qt::DirectConnection型別。如果接收者和傳送者不在一個執行緒,則自動使用Qt::QueuedConnection型別。 |
Qt::DirectConnection | 槽函式會在訊號傳送的時候直接被呼叫,槽函式運行於訊號傳送者所線上程。效果看上去就像是直接在訊號傳送位置呼叫了槽函式。這個在多執行緒環境下比較危險,可能會造成奔潰。 |
Qt::QueuedConnection | 槽函式在控制回到接收者所線上程的事件迴圈時被呼叫,槽函式運行於訊號接收者所線上程。傳送訊號之後,槽函式不會立刻被呼叫,等到接收者的當前函式執行完,進入事件迴圈之後,槽函式才會被呼叫。多執行緒環境下一般用這個。 |
Qt::BlockingQueuedConnection | 槽函式的呼叫時機與Qt::QueuedConnection一致,不過傳送完訊號後傳送者所線上程會阻塞,直到槽函式執行完。接收者和傳送者絕對不能在一個執行緒,否則程式會死鎖。在多執行緒間需要同步的場合可能需要這個。 |
Qt::UniqueConnection | 這個flag可以通過按位或(|)與以上四個結合在一起使用。當這個flag設定時,當某個訊號和槽已經連線時,再進行重複的連線就會失敗。也就是避免了重複連線。 |
sender和receiver是QObject物件指標,函式裡面我們用到了Qt提供的兩個巨集SIGNAL()和SLOT();這是Qt要求的,要關聯訊號和槽必須藉助於這兩個巨集,兩個巨集的定義如下:
#define SLOT(name) "1"#name
#define SIGNAL(name) "2"#name
通過這兩個巨集,就可以把我們傳遞進去的槽和訊號的名字轉化成字串,並在這兩個字串前面加上附加的字元。
一個訊號可以和多個槽相連(槽會一個接一個地被呼叫,但是呼叫的順序是不確定的);
多個訊號可以連線一個槽(只要任意一個訊號產生,這個槽就回被呼叫);
一個訊號可以連線到另一個訊號(當第一個訊號傳送時,第二個訊號則立刻傳送);
斷開連線的方法:
disconnect(sender,SIGNAL(signal),receiver,SLOT(slot),Qt::DirectConnection);
該方法雖然不是必須使用的,因為當一個物件delete之後,Qt自動取消所有連線到這個物件上面的槽。
但是在專案開發中,在畫面上繫結訊號的時候,通常會主動解除繫結,在畫面的哪個生命週期繫結訊號則在其對稱的生命週期中解除繫結(例如在onActive中繫結,則在onDeactive中解綁。),這麼做的目的一個我為了程式碼規範,另一個如果該物件距離自動銷燬這段時間裡邊可能會收到訊號。
參考: