1. 常见事件类型
PyQt是对Qt的封装,Qt程序是事件驱动的,它的每个动作都由幕后某个事件所触发,Qt事件的类型有很多,常见的Qt事件如下:
键盘事件:按键按下和松开。
鼠标事件:鼠标指针移动、鼠标按键按下和松开。
拖放事件:用鼠标进行拖放。
滚轮事件:用鼠标滚滚轮动。
绘屏事件:重绘屏幕的某些部分。
定时事件:定时器到时。
焦点事件:键盘焦点移动。
进入和离开事件:鼠标指针移入Widget内,或者移出。
移动事件:Widget的位置改变。
大小改变事件:Widget的大小改变。
显示和隐藏事件:Widget显示和隐藏。
窗口事件:窗口是否为当前窗口。
还有一些常见的Qt事件,比如如Socket事件、剪贴板事件、字体改变事件、布局改变事件等。
2. 使用事件处理的方法
PyQt提供了如下5种事件处理和过滤方法(由弱到强),其中只有前两种方法使用最频繁。
(1)重新实现事件函数
比如 mousePressEvent()、 keyPressEvent()、 paintEvent()。这是最常规的事件处理方法。
(2)重新实现 Qobjec.event()
一般用在PyQt没有提供该事件的处理函数的情况下,即增加新事件时。
(3)安装事件过滤器
如果对 Qobject i调用 installEventFilter,则相当于为这个 Qobject安装了一个事件过滤器,对于 Qobject的全部事件来说,它们都会先传递到事件过滤函数 eventFilter中,在这个函数中我们可以抛弃或者修改这些事件,比如可以对自己感兴趣的事件使用自定义的事件处理机制,对其他事件使用默认的事件处理机制。由于这种方法会对调用 installEventFilter的所有 Qobject I的事件进行过滤,因此如果要过滤的事件比较多,则会降低程序的性能。
(4)在 QApplication中安装事件过滤器
这种方法比上一种方法更强大: Application的事件过滤器将捕获所有 QObject的所有事件,而且第一个获得该事件。也就是说,在将事件发送给其他任何一个事件过滤器之前(就是在第三种方法之前),都会先发送给 QApplication的事件过滤器。
(5)重新实现 QApplication的 notify()方法
PyQt使用 notify()来分发事件。要想在任何事件处理器之前捕获事件,唯一的方法就是重新实现 QApplication的 notify()。在实践中,在调试时才会使用这种方法。