(轉自:http://www.cnblogs.com/andy1987/p/3322059.html)html
1. QT事件系統post
Qt應用程序的消息處理是基於事件驅動的,程序的每一個動做都是由某個事件所觸發的,例如:鼠標動做觸發QMouseEvent,鍵盤操做觸發QKeyEvent等,全部這些事件都派生於QEvent,具體事件的路由是經過QObject::event()來實現的。htm
事件通常被劃分爲兩類對象
1) 系統事件,好比鼠標,鍵盤的操做,這些事件由系統捕獲而後被插隊到系統消息隊列中,Qt應用程序經過事件循環從系統消息中讀取消息(事件)而後用QEvent進行消息(事件)封裝,接下來就是對QEvent的依次處理了.blog
2) 自發事件,主要由QT程序本身產生,而後經過postEvent或者sendEvent將事件發送到目標對象上或者消息隊列中,相似VC中自定義事件,經過PoseMessage和SendMessage進行消息的發送。 在QT系統中經過postEvent傳遞的事件將被送入到消息隊列中,而後由消息循環讀取消息,一次處理,經過sendEvent發送的事件將直接被髮送到目標對象執行,不要進行事件的排隊處理.隊列
Qt系統定義的事件類型比較多,像咱們經常使用的有:事件
鍵盤事件(Press/release) , 鼠標事件(press,release,move,double click等),拖放事件(drag ,drop) , 繪屏事件(paint),焦點事件(focus),大小改變事件(resize)等等路由
每一個事件類型都有對應的事件類對該事件相關聯的的信息進行封裝,例如鼠標事件QMouseEvent,該類記錄了當前鼠標的位置以及以及鼠標按鍵的信息, 鍵盤事件QKeyPressEvent類記錄了按下鍵信息.消息隊列
2.事件的發送event
在1在提到程序自發類型事件時候,咱們說過posetEvent和sendEvent,該兩個方法就是應用於QT系統中事件的發送。
sendEvent方法是直接將是直接將事件發送到目標對象上的,因此當目標收到事件後是直接執行的。
postEvent方法並非直接投遞事件到對象上,而是經過將事件投遞到消息隊列中,而後由消息循環從隊列中讀取事件,依次處理的 。
3.事件的處理
在Qt中對事件的處理有不少種方式
1) 直接有對應事件處理方法進行處理,例如:鼠標移動事件有mouseMoveEvent處理,鍵盤按下事件由keyPressEvent處理,每一個事件都有特定的方法用於處理該事件.
2) event()處理,在QT系統中事件的處理都是經過event()進行分發的,因此在事件落實到具體的對象和特定的方法時候,都是要經過event(),因此若是要攔截某個消息能夠經過重載event實現
3) notify()處理,notify用於事件的過濾和合並,最後實現事件的分佈,有點相似event()
4)事件過濾,事件過濾的主要是用於在事件被投遞到特定的處理方法時候,捕獲事件,並做相應處理,事件過濾也實現讓一個對象能夠對另外一個對象事件的監控,並在事件被處理前進行預處理操做.