17. [Python GUI] PyQt5中的事件系统之事件(QEvent)的接受accept和忽略ignore

PyQt5中的事件系统之事件(QEvent)的接受和忽略

一、什么是事件QEvent的接受accept和忽略ignore

前面我们一起学习了PyQt5中事件的基本概念,以及事件是如何传递和处理的,这一节我们将继续学习,在PyQt5中事件的传递过程中,它是如何被accept和ignore的,下面我们来一起看看吧:

  1. 事件可以被接受或忽略,被接受的事件不会再传递给其他对象,被忽略的事件会被传递给其他对象处理,或者该事件被丢弃(即没有对象处理该事件)

  2. 使用 QEvent::accept()函数表示接受一个事件,使用 QEvent::ignore()函数表示忽略一个事件。 也就是说若调用 accept(),则事件不会传递给父对象,若调用 ignore()则事件会向父对象传递。

  3. Qt 默认值是 accept (接受事件),但在 QWidget 的默认事件处理函数(比如 keyPressEvent())中,默认值是ignore(),因为这样可实现事件的传递(即子对象未处理就传递给父对象处理)。对事件的接受和忽略,最好是明确的调用 accept()和 ignore 函数。

  4. 在 event()函数中调用 accept()或 ignore()是没有意义的, event()函数通过返回一个 bool 值来告诉调用者是否接受了事件(true 表示接受事件)。 是否调用 accept()是用于事件处理函数与 event()函数之间通信的,而 event()函数返回的 bool 值是用于与 QApplication::notify()函数之间通信的。

  5. 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_())

程序运行效果如下:

20221121210553
本节内容就到这里啦,小手一抖,点个赞再走哦~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smart_cat

你的鼓励将是我写作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值