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