引自: http://qtsoftware.blogspot.com/
1.事件首先由Qt的ServerApplication去接收來自于外部或內(nèi)部的一些行為,鼠標(biāo)點(diǎn)擊,鍵盤輸入,時鐘事件等,分析并決定送往對應(yīng)的對象去處理(內(nèi)部管理機(jī)制,如有機(jī)會另文分析),最后會調(diào)用bool QCoreApplication::notify ( QObject * receiver, QEvent * event ) [virtual]去處理,當(dāng)然這個是虛函數(shù),你可以在子類去重新實(shí)現(xiàn)它 。
2.在notify(...)中,在發(fā)給對應(yīng)的接收者前,會先把消息送給QApplication。所以如果想在你界面的Widget前先處理那些事件,那么你可以給QApplication對象installEventFilter,然后在對應(yīng)的eventFilter()里先把這些事件都給過一遍,該和諧的先和諧掉。
3.如果QApplication沒有處理那些事件,然后就是交給事件接收對象了。在這個對象接收前,也可以為這對象加一個事件過濾器,同樣是installEventFilter,不過它的調(diào)用者是事件接收者(也就是前面那個reveiver參數(shù)),而不是QApplication/QCoreApplication.
4.經(jīng)過了前面兩級過濾后,如果事件還沒被處理(前面函數(shù)的返回值為false),那么就會進(jìn)入接收者的event()函數(shù),你可以里面根據(jù)事件的不同類型盡情處理。
5.默認(rèn)event()函數(shù)根據(jù)事件類型會調(diào)用不同的事件處理函數(shù),類似mouseEvent(),keyEvent()去分別處理他們。
以上事件處理流程,由復(fù)雜的簡單。至于每一步我們寫代碼的時候,都會怎么去用它,可以參考http://www.cnblogs.com/smoozer/archive/2009/02/09/1386704.html 這個哥們的翻譯文章。