我們檢視文件時,發現connect函式還有第五個引數。那麼這個引數的作用是什麼呢?我們之前使用的是預設值,具體的功能是什麼呢?
每乙個執行緒都有自己的事件佇列
執行緒通過事件佇列接收訊號
訊號在事件迴圈中被處理
示例**:訊號與槽的連線方式
class myobject : public qobject
;void myobject:
:testslot()
class testthread : public qthread
;void testthread:
:run()
emit testsignal()
;exec()
;qdebug()
<<
"void testthread::run() -- end"
;}
直接在傳送訊號的執行緒中呼叫槽函式,等價於槽函式的實時呼叫!
示例**:訊號與槽的直接呼叫
void
direct_connection()
intmain
(int argc,
char
*ar**)
輸出結果:我們可以發現,當執行緒傳送訊號時,便立即呼叫了槽函式。接著才退出執行緒。main() tid = 0x2ff4
void testthread::run() – begin tid = 0x1d98
void testthread::run() i = 0
void testthread::run() i = 1
void testthread::run() i = 2
void myobject::testslot() tid = 0x1d98
void testthread::run() – end
訊號傳送至目標執行緒的事件佇列,由目標執行緒處理;當前執行緒繼續向下執行
示例**:訊號與槽的非同步呼叫
void
queued_connection()
intmain
(int argc,
char
*ar**)
輸出結果:我們可以發現,當傳送訊號後,需要等待執行緒結束後再執行相應的槽函式。main() tid = 0x1fbc
void testthread::run() – begin tid = 0x32f0
void testthread::run() i = 0
void testthread::run() i = 1
void testthread::run() i = 2
void testthread::run() – end
void myobject::testslot() tid = 0x1fbc
訊號傳送至目標執行緒的事件佇列,由目標執行緒處理;當前執行緒等待槽函式返回,之後繼續向下執行!
注意:目標執行緒與當前執行緒必須不同
示例**:訊號與槽的同步呼叫
void
blocking_queued_connection()
intmain
(int argc,
char
*ar**)
輸出結果:[外鏈轉存失敗(img-c3e2hdf9-1563242662208)(/home/shangrongomain() tid = 0x2554
void testthread::run() – begin tid = 0x130
void testthread::run() i = 0
void testthread::run() i = 1
void testthread::run() i = 2
void myobject::testslot() tid = 0x2554
void testthread::run() – end
描述
小知識
Qt訊號與槽連線
connect pointer1,pointer2,pointer3,pointer4 pointer1 指向傳送訊號的物件的指標 pointer2 傳送訊號的物件所對應的類的成員函式的指標 pointer3 接收訊號的物件的指標 pointer4 接收訊號的物件所對應物件的槽函式指標 總結下來就是...
QT訊號與槽的連線方式
一.qt autoconnection qt autoconnection表示系統自動選擇相應的連線方式,如果訊號與槽在同一執行緒,就採用qt directconnection,如果訊號與槽不在同一執行緒,將採用qt queuedconnection的連線方式。二.qt directconnecti...
Qt原理分析 五 Qt中訊號與槽的對應關係
到目前為止,我們已經可以吧訊號與槽連線在一起了。但我們還需要考慮一些其他的可能性。例如下圖所示 如signal5連線了slot2和slot3。void one to multi 輸出結果 one to multi void myslot int v sender t receiver r1 valu...