PyQt5中的事件系统之事件(QEvent)的接受accept和忽略ignore
PyQt5中的事件系统之事件(QEvent)的接受和忽略
一、什么是事件QEvent的接受accept和忽略ignore
前面我们一起学习了PyQt5中事件的基本概念,以及事件是如何传递和处理的,这一节我们将继续学习,在PyQt5中事件的传递过程中,它是如何被accept和ignore的,下面我们来一起看看吧:
-
事件可以被接受或忽略,被接受的事件不会再传递给其他对象,被忽略的事件会被传递给其他对象处理,或者该事件被丢弃(即没有对象处理该事件)
-
使用 QEvent::accept()函数表示接受一个事件,使用 QEvent::ignore()函数表示忽略一个事件。 也就是说若调用 accept(),则事件不会传递给父对象,若调用 ignore()则事件会向父对象传递。
-
Qt 默认值是 accept (接受事件),但在 QWidget 的默认事件处理函数(比如 keyPressEvent())中,默认值是ignore(),因为这样可实现事件的传递(即子对象未处理就传递给父对象处理)。对事件的接受和忽略,最好是明确的调用 accept()和 ignore 函数。
-
在 event()函数中调用 accept()或 ignore()是没有意义的, event()函数通过返回一个 bool 值来告诉调用者是否接受了事件(true 表示接受事件)。 是否调用 accept()是用于事件处理函数与 event()函数之间通信的,而 event()函数返回的 bool 值是用于与 QApplication::notify()函数之间通信的。
-
QCloseEvent(关闭事件)有一些不同, QCloseEvent::ignore()表示取消关闭操作,而QCloseEvent::accept()则表示让 Qt 继续关闭操作。为避免产生混淆,最好在 closeEvent()处理函数的重新实现中显示地调用 accept()和 ignore()。
二、QEvent的accept和ignore代码示例
代码示例:
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.QtCore import qDebug, QEvent
from PyQt5 import QtGui
import sys
class MyWidget(QWidget):
def __init__(self):
super().__init__()
def mousePressEvent(self, e: QtGui.QMouseEvent) -> None:
'''
重写mousePressEvent事件处理函数
'''
qDebug('MyWidget: mouse press')
return super().mousePressEvent(e)
def keyPressEvent(self, e: QtGui.QKeyEvent) -> None:
'''
重写keyPressEvent事件处理函数
'''
qDebug('MyWidget: key press')
return super().keyPressEvent(e)
class MyButton(QPushButton):
def mousePressEvent(self, e: QtGui.QMouseEvent) -> None:
'''
重写mousePressEvent事件处理函数
'''
qDebug('MyButton: mouse press')
e.accept() # 事件被接受后,不再传递给父对象
def keyPressEvent(self, e: QtGui.QKeyEvent) -> None:
'''
重写keyPressEvent事件处理函数
'''
qDebug('MyButton: key press')
e.ignore() # 事件被忽略后,将继续传递给父对象
if __name__ == '__main__':
app = QApplication(sys.argv)
my_widget = MyWidget()
my_btn = MyButton('test', my_widget)
my_widget.show()
sys.exit(app.exec_())
程序运行效果如下:
本节内容就到这里啦,小手一抖,点个赞再走哦~~~