Qt事件和信號的區別

問題:

     什麼時候用事件,什麼時候用信號呢?是不是不同的線程間用事件,信號不能用在線程間?

解答:

    仔細來看,事件與信號其實並無多大差別,從我們對其需求上來說,都只要能註冊事件或信號響應函數,在事件或信號產生時能夠被通知到即可。但有一項區別在 於,事件處理函數的返回值是有意義的,我們要根據這個返回值來確定是否還要繼續事件的處理,比如在QT中,事件處理函數如果返回true,則這個事件處理 已完成,QApplication會接着處理下一個事件,而如果返回false,那麼事件分派函數會繼續向上尋找下一個可以處理該事件的註冊方法。信號處 理函數的返回值對信號分派器來說是無意義的。

    另外還有一個需要我們關注的問題是事件和信號處理時的優先級問題。在QT中,事件因爲都是與窗口相關的,所以事件回調時都是從當前窗口開始,一級一級向上 派發,直到有一個窗口返回true,截斷了事件的處理爲止。對於信號的處理則比較簡單,默認是沒有順序的,如果需要明確的順序,可以在信號註冊時顯示地指 明槽的位置。
    在QT中,事件使用了一個事件隊列來維護,如果事件的處理中又產生了新的事件,那麼新的事件會加入到隊列尾,直到當前事件處理完畢後, QApplication再去隊列頭取下一個事件來處理。而信號的處理方式有些不同,信號處理是立即回調的,也就是一個信號產生後,他上面所註冊的所有槽 都會立即被回調。這樣就會產生一個遞歸調用的問題,比如某個信號處理器中又產生了一個信號,會使得信號的處理像一棵樹一樣的展開。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章