(转自: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)事件过滤,事件过滤的主要是用于在事件被投递到特定的处理方法时候,捕获事件,并做相应处理,事件过滤也实现让一个对象能够对另外一个对象事件的监控,并在事件被处理前进行预处理操做.