信號和槽主要用於組件之間的通信,類似於.net和java中的委托。
使用QObject::connect方法將信號與槽關聯起來,然後信號的發起者發出信號,接受者中的槽函數就會執行。
比如connect(this,SIGNAL(start()),worker,SLOT(Start())),將當前類中start信號關聯到worker對象的Start函數,當我們調用emit this->start()時就發出信號,槽函數就會收到這個信號。
connect函數還有第五個參數,這個參數決定信號何時傳給槽,這裡提一下,不過本人目前一直使用的默認值。
Qt::AutoConnection,默認值自動連接,當信號發起者與槽函數執行者在同一線程時,就會使用Qt::DirectConnection,反之則使用Qt::QueuedConnection。
Qt::DirectConnection,直接相連,信號一發起槽函數立馬執行,信號發起者與執行者在同一線程。
Qt::QueuedConnection,隊列式,信號發起者與執行者不在同一個線程,信號發起時,槽函數會等待調度。
Qt::BlockingQueuedConnection,跟Qt::QueuedConnection一樣,不同的是信號發起時存在互斥鎖,要等待槽函數返回,這樣如果槽函數與信號函數在同一個線程中就會發生死鎖(也就是一直堵在鎖的位置,沒法進入槽函數)。
Qt::UniqueConnection,這個通過“或”跟上面的一起使用,表示同樣的connection只能連接一次,好像沒啥作用了,對象、信號、槽相同的connection多次連接會失敗。
信號與槽要想斷開連接,使用QObject::disconnect方法。
關於信號和槽的使用也就這麼多,但是經常用,特別是在多線程裡面,遇上槽函數沒執行可能是連接寫錯了或是槽函數所在線程哪裡堵住了(比如死循環之類的)。