eventFilter函数是直接从QObject继承的定义的事件刷选虚拟函数,如果一个对象A使用installEventFilter函数将另一个对象B安装了B的实例方法eventFilter,则这个对象B将会调用eventFilter进行事件刷选。
修订:上面这段话的描述有误,经过后期学习及测试,eventFilter方法无需是B本身的实例方法,只要是任何一个QObject派生类的eventFilter方法都可以,就是说,安装者、被监视对象以及eventFilter方法所在对象可以是三个独立对象。具体可参考《PyQt(Python+Qt)实现的GUI图形界面应用程序的事件捕获方法大全及对比分析》的详细介绍。
在实现eventFilter函数时,如果要筛选出事件停止进一步处理它,则返回True;否则返回False,如果不知道怎么处理,则调用父类eventFilter方法返回。
eventFilter语法
bool QObject.eventFilter(QObject watched, QEvent event)
其中:
1、watched就是被安装了eventFilter的对象;
2、event就是接收到的事件信息;
3、返回值为True则该事件不会再传递,否则会继续传递。
installEventFilter语法
installEventFilter(QObject filterObj)
其中:filterObj就是需要进行事件刷选的对象,该方法无返回值。
案例:
如果要在一个窗口中进行事件刷选,可以在该窗口自定义类中实现eventFilter方法,并在应用中安装该方法。
示例代码1:实现eventFilter方法
class winTest(QtWidgets.QMainWindow,Ui_wintest.Ui_MainWindow ):
def __init__(self):
super(winTest, self).__init__()
self.setupUi(self)
self.setWhatsThis("窗口属性设置测试")
def eventFilter(self, objwatched, event):
eventType = event.type()
flag = False
if eventType == QEvent.MouseButtonPress or eventType == QEvent.KeyPress:
print(f"***************In eventFilter:事件类型值={eventType},事件objwatched={objwatched}")
elif eventType == QtCore.QEvent.Close:
print(f"***************In eventFilter:事件类型值={eventType},事件objwatched={objwatched}")
showMessage(self, 'eventFilter警告',"系统将退出,是否确认?", QMessageBox.Yes |QMessageBox.No, QMessageBox.No)
return super().eventFilter(objwatched, event)
示例代码2:在主程序中给主窗口对象安装事件刷选
if __name__ == '__main__':
app = App(sys.argv)
w = winTest()
w.show()
app.installEventFilter(w)
sys.exit(app.exec_())
博客地址:https://blog.csdn.net/LaoYuanPython
老猿Python博客文章目录:https://blog.csdn.net/LaoYuanPython/article/details/98245036