Qt 信號和槽機制和回調函數區別

原文鏈接: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就保證了適合的槽得到了調用。即使關聯的對象在運行時被刪除。應用程序也不會崩潰。
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章