connect(sender, SIGNAL(signal), receiver, SLOT(slot)); //其中 sender 與 receiver 是指向對象的指針,SIGNAL() 與 SLOT() 是轉換信號與槽的宏。
(1)類型安全。須要關聯的信號和槽的簽名必須是等同的,即信號的參數類型和參數個數同接收該信號的槽的參數類型和參數個數相同。不過,一個槽的參數個數是能夠少於信號的參數個數的,但缺乏的參數必須是信號參數的最後一個或幾個參數。若是信號和槽的簽名不符,編譯器就會報錯。
(2)鬆散耦合。信號和槽機制減弱了Qt對象的耦合度。激發信號的Qt對象無需知道是哪一個對象的哪一個槽須要接收它發出的信號,它只需在適當的時間發送適當的信號就能夠了,而不須要知道也不關心它的信號有沒有被接收到,更不須要知道是哪一個對象的哪一個槽收到了信號。一樣的,對象的槽也不知道是哪些信號關聯了本身,而一旦關聯信號和槽,Qt就保證了適合的槽獲得了調用。即便關聯的對象在運行時被刪除,應用程序也不會崩潰。
(3)信號和槽機制加強了對象間通訊的靈活性。一個信號能夠關聯多個槽,也能夠多個信號關聯一個槽。安全
同回調函數相比,信號和槽機制運行速度有些慢。經過傳遞一個信號來調用槽函數將會比直接調用非虛函數運行速度慢10倍。緣由以下:
(1)須要定位接收信號的對象;
(2)安全地遍歷全部的關聯(如一個信號關聯多個槽的狀況);
(3)編組/解組傳遞的參數;
(4)多線程的時候,信號可能須要排隊等待。
然而,與建立對象的new操做及刪除對象的delete操做相比,信號和槽的運行代價只是他們不多的一部分。信號和槽機制致使的這點性能損耗,對實時應用程序是能夠忽略的。多線程
能夠經過connect的第五個參數進行控制信號槽執行時所在的線程函數
connect有幾種鏈接方式,直接鏈接和隊列鏈接、自動鏈接性能
直接鏈接:信號槽在信號發出者所在的線程中執行線程
隊列鏈接:信號在信號發出者所在的線程中執行,槽函數在信號接收者所在的線程中執行指針
自動鏈接:多線程時爲隊列鏈接函數,單線程時爲直接鏈接函數。code