https://blog.csdn.net/m0_37806112/article/details/83933268
定義:
Qt使用信號與槽機制進行對象間的通信,當某個對象的狀態發生變化時,該對象會觸發一個信號,該信號和另外一些對象的槽函數綁定,信號的觸發將導致執行這些槽函數,這些槽函數將處理第一個對象狀態的變化,完成對象之間的通信。
分析:
為什么Qt使用信號與槽機制而不是傳統的回調函數機制進行對象間的通信呢?
① 回調函數的本質是“你想讓別人的代碼執行你的代碼,而別人的代碼你又不能動”這種需求下產生的。
回調函數是函數指針的一種用法,如果多個類都關注某個類的狀態變化,此時需要維護一個列表,以存放多個回調函數的地址。對於每一個被關注的類,都需要做類似的工作,因此這種做法效率低,不靈活。
回調函數的栗子:
1 #include <stdio.h>
2 3 void printWelcome(int len) 4 { 5 printf("歡迎歡迎 -- %d/n", len); 6 } 7 void printGoodbye(int len) 8 { 9 printf("送客送客 -- %d/n", len); 10 } 11 void callback(int times, void(*print)(int)) 12 { 13 int i; 14 for (i = 0; i < times; ++i) 15 { 16 print(i); 17 } 18 printf("/n我不知道你是迎客還是送客!/n/n"); 19 } 20 21 void main(void) 22 { 23 callback(2, printWelcome); 24 callback(2, printGoodbye); 25 }
②Qt使用信號與槽機制來解決這個問題,程序員只需要指定一個類含有哪些信號函數、哪些槽函數,Qt會處理信號函數和槽函數之間的綁定。當信號函數被調用時,Qt會找到並執行與其綁定的槽函數。允許一個信號函數和多個槽函數綁定,Qt會依次找到並執行與一個信號函數綁定的所有槽函數,這種處理方式更靈活。
③Qt信號與槽機制降低了Qt對象的耦合度。
激發信號的Qt對象無須知道是哪個對象的哪個槽需要接收它發出的信號,它只需要做的是在適當的時間發送適當的信號就可以了,而不需要知道也不關心它的信號有沒有被接收到,更不需要知道哪個對象的哪個槽接收到了信號。
同樣地,對象的槽也不知道是哪些信號關聯了自己,而一旦關聯信號和槽,Qt就保證了適合的槽得到了調用。即使關聯的對象在運行時被刪除。應用程序也不會崩潰。

