QT事件系统
QEvent、基类
事件是应用程序获取内部或外部产生的事情或动作的方式,在Qt中使用一个对象(类)来表示一个事件,继承自QEvent类。事件与信号不同,比如单击一个按钮,就会产生鼠标单击事件QMouseEvent(不是按钮产生的)
,而因为按钮被按下,它会发出clicked()
信号。在Qt中,任何QObjiect子类都可以接受和处理事件。
事件的处理
每个事件都是QEvent的子类,而一个事件有多个事件类型,比如鼠标事件可以分为鼠标左键按下、鼠标右键按下、双击鼠标左键等多种事件类型。这些事件类型通过QEvent::Type
枚举类型表示,其中有一百多种事件类型。
在QCoreApplication类的notify()函数
的帮助文档中提供了5种事件处理方法:
-
重新实现部件的
painEvent()、mousePressEvent()等事件处理函数
。只能用来处理特定部件的特定事件。 -
重新实现
notify()
函数,这个函数功能强大,提供了完全的控制,可以在事件过滤器得到事件之前就获得他们。但是,它一次只能处理一个事件。 -
向
QApplication
对象上安装事件过滤器。因为一个程序只有一个QApplication对象,所有这样实现的功能与使用notif()
函数是相同的,优点是可以同时处理多个事件。 -
重新实现
event()
函数。QObject类
的event()
函数可以在事件到达默认的事情处理函数之前获得该事件。 -
在对象上安装事件过滤器。使用事件过滤器可以在一个界面类中同时处理不同子部件的不同事件。
在实际编程中,最常用的是方法一,其次是方法五。因为方法二需要继承QApplication类
;而方法三要使用一个全局的事件过滤器,会减缓事件的传递。
事件的传递
在每个main()
函数的最后都会调用QApplication类的exec()函数
让程序进入事件循环使程序在运行时接收各种发生的事件。一旦有事情发生,Qt会构建一个相应的QEvent
子类的对象来表示事件,然后传递给相应的QObject
对象或子对象处理。
事件先传递给指定的窗口部件(获得焦点的窗口部件),如果该部件忽略掉该事件,这个事件就会传递给这个部件的父部件。在重新实现事件处理函数时,一般调用父类的相应事件处理函数来实现默认操作。
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
有事件过滤器的传递顺序是这样的:先是事件过滤器,然后是该部件的event()
函数,最后是该部件的事件处理函数。event函数和事件处理函数可以在部件内重新定义,而事件过滤器却是在部件的父部件中进行定义。
鼠标事件和滚轮事件
QMouseEvent类表示一个鼠标事件,在窗口部件中按下鼠标或移动鼠标都会产生鼠标事件。