仔細來看,事件與信號其實並無多大差別,從我們對其需求上來說,都只要能注冊事件或信號響應函數,在事件或信號產生時能夠被通知到即可。但有一項區別在於,事件處理函數的返回值是有意義的,我們要根據這個返回值來確定是否還要繼續事件的處理,比如在QT中,事件處理函數如果返回true,則這個事件處理已完成,QApplication會接着處理下一個事件,而如果返回false,那么事件分派函數會繼續向上尋找下一個可以處理該事件的注冊方法。信號處理函數的返回值對信號分派器來說是無意義的。
另外還有一個需要我們關注的問題是事件和信號處理時的優先級問題。在QT中,事件因為都是與窗口相關的,所以事件回調時都是從當前窗口開始,一級一級向上派發,直到有一個窗口返回true,截斷了事件的處理為止。對於信號的處理則比較簡單,默認是沒有順序的,如果需要明確的順序,可以在信號注冊時顯示地指明槽的位置。
在QT中,事件使用了一個事件隊列來維護,如果事件的處理中又產生了新的事件,那么新的事件會加入到隊列尾,直到當前事件處理完畢后, QApplication再去隊列頭取下一個事件來處理。而信號的處理方式有些不同,信號處理是立即回調的,也就是一個信號產生后,他上面所注冊的所有槽都會立即被回調。這樣就會產生一個遞歸調用的問題,比如某個信號處理器中又產生了一個信號,會使得信號的處理像一棵樹一樣的展開。