Qt事件系统基本概念

(转自:http://www.cnblogs.com/andy1987/p/3322059.html)

1. QT事件系统

    Qt应用程序的消息处理是基于事件驱动的,程序的每个动作都是由某个事件所触发的,例如:鼠标动作触发QMouseEvent,键盘操作触发QKeyEvent等,所有这些事件都派生于QEvent,具体事件的路由是通过QObject::event()来实现的。

    事件一般被划分为两类

    1) 系统事件,比如鼠标,键盘的操作,这些事件由系统捕获然后被插队到系统消息队列中,Qt应用程序通过事件循环从系统消息中读取消息(事件)然后用QEvent进行消息(事件)封装,接下来就是对QEvent的依次处理了.

    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.事件的发送

 在1在提到程序自发类型事件时候,我们说过posetEvent和sendEvent,该两个方法就是应用于QT系统中事件的发送。

 sendEvent方法是直接将是直接将事件发送到目标对象上的,所以当目标收到事件后是直接执行的。

 postEvent方法并不是直接投递事件到对象上,而是通过将事件投递到消息队列中,然后由消息循环从队列中读取事件,依次处理的 。


3.事件的处理

 在Qt中对事件的处理有很多种方式

 1) 直接有对应事件处理方法进行处理,例如:鼠标移动事件有mouseMoveEvent处理,键盘按下事件由keyPressEvent处理,每个事件都有特定的方法用于处理该事件.

 2)  event()处理,在QT系统中事件的处理都是通过event()进行分发的,所以在事件落实到具体的对象和特定的方法时候,都是要通过event(),所以如果要拦截某个消息可以通过重载event实现

3) notify()处理,notify用于事件的过滤和合并,最后实现事件的分布,有点类似event()

4)事件过滤,事件过滤的主要是用于在事件被投递到特定的处理方法时候,捕获事件,并作相应处理,事件过滤也实现让一个对象可以对另一个对象事件的监控,并在事件被处理前进行预处理操作.

原文地址:https://www.cnblogs.com/FindSelf/p/3712063.html