事件过滤器

使用场景

某个窗口里面有很多个控件,你希望某个控件有自己的事件触发时对应的操作,而你又不想新增加一个类来自定义一下这个控件,那么你可以在这个窗口中给对应的控件安装事件过滤器,然后重写该窗口的bool eventFilter(QObject* watched, QEvent* event)函数

安装过滤器

控件A->installEventFilter(过滤者);

1.过滤者通常就是控件所在的窗口

2.所有发向控件A的事件都会被过滤者截获/过滤

3.截获/过滤的位置是过滤者的eventFilter()函数中

4.eventFilter() 函数返回一个 bool 类型, 返回 true 表示事件被截获,不再发送给控件A ,返回 false 表示事件会接着传递给控件A

举例

class MyWidget:public QWidget
{

       Q_OBJECT
private: 
    //该窗口内部有一个标签控件
    QLabel* m_label;
    
    //该窗口内部有一个按钮控件
    QPushbutton* m_button;


public:
    explicit MyWidget(QWidget *parent = nullptr):QWidget(parent)
    {
        //在该窗口的构造函数中给你想要有定制化事件操作的控件安装过滤器
        //被安装者是Label控件,过滤者是该窗口this,都是用的指针
        m_label->installEventFilter(this);
    }
    
    void addLabel()
    {
        //也不一定非要在构造函数里面给控件安装事件过滤器
        //也可以即用即安装,即使是一个临时添加的控件也可以给他安装事件过滤器
        QLabel* temp_label=new QLabel(this);
        temp_label->installEventFilter(this);
    }

protected:
    //对所在窗口的eventFilter函数进行重写
    //watched:安装了事件过滤器的控件
    //event:触发的事件
    bool eventFilter(QObject* watched, QEvent* event) override
    {
        //写法如下:
        //首先判断事件是否是发给m_label的,然后再做处理,因为还有可能有其他控件
        //也安装了事件过滤器,也有没安装过滤器的控件
        if(watched==m_label)
        {
            //接下来就是如下形式了,想定制什么事件,按下面的格式进行定制就行了
            //至此这个控件就可以对不同事件做出不同的响应了
            if(event->type()==QEvent::Enter)
            {
               //鼠标进入时,标签文本改变
               m_label->setText("你好世界");
               //其他操作.....
            }
            else if(事件A)
            {
                //......
            }
            else if(事件B)
            {
                //......
            }
            
        }
        else if(watched==控件A)//其他安装过滤器的控件
        {
            //.....
        }
        else
        {
            //.....
        }

        //最后调用一下父类的eventFilter函数,表示其他没有在上面定制的事件则交给父类处理
        //固定这么写,每次加上就行了
        return QWidget::eventFilter(watched, event);
    }


}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值