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