基于窗体(Widget)的应用程序都是事件(event)驱动的,最主要的是鼠标事件、键盘事件、绘制事件、。事件由抽象类QEvent表示,包括很多子类,QMouseEvent,QKeyEvent,QPaintEvent等。
QObject类event函数相当于事件的一个总入口,参数e是QEvent类型,可能为QMouseEvent,QKeyEvent,QPaintEvent等.
#event函数原型
event(self,e)#参数e是QEvent类型
QEvent类主要有三个接口函数:
accept():表示事件接受者接受此事件,对此事件进行处理,不会再传给上层容器
ignore():表示事件接受者忽略此事件,传给上层容器
type():返回事件的类型,是枚举类型QEvent.Type
installEventFilter指定控件的事件监测者,该方法无返回值。
installEventFilter(QObject filterObj)#原型,filterObj就是事件监测者
self.label.installEventFilter(self)#伪代码,self为label所在窗体,label上触发的事件会发送给窗体进行处理。
在这个函数中,根据watched的值来判断事件来自哪个被监测对象,根据event.type() 的值来判断事件类型,从而确定需要执行什么操作。
bool QObject.eventFilter(QObject watched, QEvent event)#原型,watched事件来自哪个被监测对象,event事件类型
我在程序中有这样一个应用,父窗口弹出一个非模态子对话框,如果回到父窗口中进行其他操作,则关闭非模态子对话框,下面是我的实现程序:
self.installEventFilter(self)#父窗口监测自己本身事件
def eventFilter(self, widget, event):
if event.type() == QtCore.QEvent.WindowActivate:#判断事件类型
if self.isActiveWindow():#如果父窗口是当前活动窗口
if self.keyboard is not None: #如果self.keyboard没关闭,则关闭
self.keyboard.close()
return False