QT学习 之 事件与事件过滤器

事件

在Qt中,事件是作为对象处理的,所有事件对象继承自抽象类QEvent。此类用来表示程序内部发生或者来自于外部但应用程序应该知道的动作。事件能够能过被 QObject 的子类接受或者处理,但是通常用在与组件有关的应用中。本文主要阐述了在一个典型应用中的事件接收与处理。

事件的传递发送

当一个事件产生时,Qt 通过实例化一个 QEvent 的合适的子类来表示它,然后通过调用 event() 函数发送给 QObject 的实例(或者它的子类)。
event() 函数本身并不会处理事件,根据事件类型,它将调用相应的事件处理函数,并且返回事件被接受还是被忽略。
一些事件,比如 QMouseEvent 和 QKeyEvent,来自窗口系统;有的,比如 QTimerEvent,来自于其他事件源;另外一些则来自应用程序本身。

事件的类型

大部分事件类型有专门的类,比如 QResizeEvent, QPaintEvent, QMouseEvent, QKeyEvent 和 QCloseEvent。它们都是 QEvent 的子类,并且添加了自己特定的事件处理函数。比如 QResizeEvent 事件添加了 size()和 oldSize() 函数,使组件获知自身大小的改变。

有些事件支持不止一个事件类型。比如 QMouseEvent 鼠标事件,可以表示鼠标的按下,双击,移动,以及其它的一些操作。

每一个事件都有其相关联的类型,由 QEvent::Type 定义。我们能够很方便地在运行时用这些类型来判断该事件是哪一个子类。

因为程序响应方式的多样性和复杂性,Qt 的事件传递机制是富有弹性很灵活的。QCoreApplication::notify() 的相关文档阐述大部分内容;Qt Quarterly 中的文章 Another Look at Events 也进行了简要描述。在这里我们的阐述对于 95% 的程序而言来说已经足够了。

事件的处理

通常事件的处理需要调用一个虚函数。比如,QPaintEvent 事件的处理需要调用 QWidget::paintEvent() 函数。这个虚函数负责做出适当的响应,通常是用来重绘组件。如果你在自己的函数中并不打算实现所有的处理,你可以调用基类的实现。
例如,下面的代码用来处理鼠标左键点击一个自定义的选择框的操作,而其他的点击事件则被传递给基类 QCheckBox 处理。

void MyCheckBox::mousePressEvent(QMouseEvent *event)
{
    if (event->button() == Qt::LeftButton) {
        // handle left mouse button here
    } else {
        // pass on other buttons to base class
        QCheckBox::mousePressEvent(event);
    }
}

如果你想代替基类的处理,你必须自己实现所有的功能。但是,如果你只想扩展子基类的功能,你只需要实现你自己需要的那部分,剩

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyQt5的事件过滤器是一种机制,通过它可以拦截和处理发送给QObject对象的事件事件过滤器可以拦截并处理对象接收到的事件,也可以将事件传递给对象进行处理。在PyQt5中,实现事件过滤器的注意事项如下: 1. 首先,需要安装事件过滤器。在代码中,使用`installEventFilter()`方法将事件过滤器加载到对象上,例如`self.label.installEventFilter(self)`。 2. 然后,需要重写`eventFilter()`方法。这个方法接收两个参数:`a0`表示事件的接收对象,`a1`表示事件对象本身。方法的返回值是一个布尔值,用于指示是否拦截事件。如果返回True,表示拦截事件并进行处理;如果返回False,表示不拦截事件,将其传递给对象进行处理。方法的定义如下:`def eventFilter(self, a0: 'QObject', a1: 'QEvent') -> bool:`。 3. 在`eventFilter()`方法中,可以通过判断事件类型来选择处理特定的事件。例如,通过`a1.type()==QEvent.Enter`判断鼠标进入事件,通过`a1.type()==QEvent.Leave`判断鼠标离开事件。 4. 在事件处理中,可以根据需要对对象进行相应的操作。例如,可以改变对象的样式、文本等属性。 下面是一个示例,展示了一个标签控件,使用事件过滤器实现鼠标进入时字体变红、背景色变青,鼠标离开时字体变黑、背景色变黄的效果: ```python from PyQt5.Qt import * class Window(QWidget): def __init__(self): super().__init__() self.setWindowTitle("事件过滤器学习") self.resize(500, 500) self.setup_ui() self.red = 'QLabel#label{color:#FF0000;background-color:cyan}' self.black = 'QLabel#label{color:#000000;background-color:yellow;}' def setup_ui(self): self.label = QLabel(self) self.label.resize(50, 30) self.label.setObjectName('label') self.label.installEventFilter(self) # 给标签加载事件过滤器 def eventFilter(self, a0: 'QObject', a1: 'QEvent') -> bool: if a0 == self.label: if a1.type() == QEvent.Enter: self.label.setText('我是红色') self.label.setStyleSheet(self.red) return True elif a1.type() == QEvent.Leave: self.label.setText('我是黑色') self.label.setStyleSheet(self.black) return True return super().eventFilter(a0, a1) if __name__ == '__main__': import sys app = QApplication(sys.argv) win = Window() win.show() sys.exit(app.exec_()) ``` 在这个示例中,我们创建了一个窗口类`Window`,其中包含一个标签控件`label`。在`setup_ui()`方法中,我们将标签加载了事件过滤器,并在`eventFilter()`方法中处理了鼠标进入和离开事件。当鼠标进入标签时,标签的文本变为"我是红色",样式变为红色的字体和青色的背景;当鼠标离开标签时,标签的文本变为"我是黑色",样式变为黑色的字体和黄色的背景。 希望这个示例能帮助您理解PyQt5中事件过滤器的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值