PyQt学习随笔:应用中通过installEventFilter安装重写的eventFilter捕获应用事件的方法

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

原文地址:https://www.cnblogs.com/LaoYuanPython/p/11931693.html