Qt中事件的理解(1)

2019-07-25  本文已影响0人  xixiaxi

1、Qt中的事件

Qt中,事件作为一个对象,继承自QEvent类,常见的有键盘事件QKeyEvent、鼠标事件QMouseEvent和定时器事件QTimerEvent等,继承关系图如下图所示:

需要说明的是,事件与信号并不相同。

比如:鼠标单击按钮,鼠标事件(QMouseEvent),而按钮本身发射clicked()信号。一般而言我们只需要关注单击信号,不用考虑鼠标事件。但是当我们要对该按钮做额外操作,不想通过信号处理,此时事件就是一个很好的选择。关闭事件(QCloseEvent)是一个常用的事件。

2、事件的处理

鼠标按钮信号分为单机,双击,右键等操作,而这对鼠标事件而言其都是一个鼠标事件,只不过用枚举类型QEvent::Type来区分不同的操作。QEvent的子类能够表示事件却不能处理事件。

信号是通过connect()来绑定槽函数处理响应,那么事件是怎么处理的呢?

处理事件有5种常用的方法:

(1)、重新实现部件的paintEvent()、mousePressEvent()等事件处理函数。这是最常用的一种方法,不过只能用来处理特定部件的特定事件。

(2)、重新实现notify()函数。这个函数的功能强大,提供了完全的控制,可以再事件过滤器得到事件之间就获得他们。但是,它一次只能处理一个事件。

(3)、向QApplication对象上安装事件过滤器。因为一个程序只有一个QApplication对象,实现的功能和notify()函数相同,优点是可以同时处理多个事件。

(4)、重新实现event()函数。QObject类的event()函数可以在事件达到默认事件处理函数之前获得该事件。

(5)、在对象上安装事件过滤器。使用事件过滤器可以再一个界面类中同时处理不同子部件的事件。

实际编程中最常用的是方法(1),其次是方法(5)。方法2要继承QApplication类,方法3需要全局的事件过滤器,减缓事件的传递。

3、Qt事件过滤器

很多时候,我们只对某些特定的事件比较关心,例如:鼠标单击或者键盘按下等事件。其它的事件我们并不关心它是否发生,也无需对它们进行处理,这个时候最直接的想法就是将这些事件过滤掉,这样做既可以免去对它们进行处理,也可以避免它们对程序其它部分产生影响。因此,我们引入了事件过滤器这个概念。

如果对象安装了事件过滤器,则事件在到达目标对象之前先被事件过滤器截获,进行一些处理之后再交给目标对象。

实现一个事件过滤包括两个步骤:

(1)、 在目标对象上调用installEventFilter(),注册监视对象。

(2)、 在监视对象的eventFilter()函数中处理目标对象的事件。

这两步都在父窗口类中实现。

后文将结合实例进一步学习,了解事件的传递。

上一篇下一篇

猜你喜欢

热点阅读