Qt5事件过滤器

1、事件过滤器用于拦截传递到目标对象的事件,这样可以实现监视目标对象事件的作用 2、Qt 实现事件过滤器的步骤如下: ①、Qt 调用void QObject::installEventFilter (QObject* filterObj),给filterObj 对象设置安装(或注册)事件过滤器,filterObj 也称为过滤器对象。事件过滤器通常在构造函数中进行注册。 ②、在上一步注册的 filterObj 对象,通过调用bool QObject::eventFilter(QObject* obj, QEvent* e);来接收拦截到的事件。也就是说拦截到的事件在 filterObj 对象中的 eventFilter 函数中处理。eventFilter 的第一个参数 obj 指向的是事件本应传递到的目标对象 这样,该组件及其子组件的事件就会被监听 ③、使用 QObject::removeEventFilter(QObject *obj)函数可以删除事件过滤器 3、事件过滤器处理事件的规则 ①、过滤器对象的 eventFilter()函数可以接受或拒绝拦截到的事件,若该函数返回 false,则表示事件需要作进一步处理,此时事件会被发送到目标对象本身进行处理(注意:这里并未向父对象进行传递),若 evetnFilter()返回 true,则表示停止处理该事件,此时目标对象和后面安装的事件过滤器就无法获得该事件

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

②、若同一对象安装了多个事件过滤器,则最后安装的过滤器首先被激活   a.h

#ifndef A_H
#define A_H
#include<QObject>
#include<QMouseEvent>
#include <QDebug>

class A : public QObject
        //A类的对象用作过滤器对象,使用事件过滤器需继承QObject
{
    Q_OBJECT
public:
    explicit A(QObject *parent = nullptr);

    bool eventFilter(QObject *w, QEvent *e);//重写事件过滤函数
    //w 事件接受者指针

signals:

};

#endif // A_H

a.cpp

#include "a.h"

A::A(QObject *parent) : QObject(parent)
{

}

bool A::eventFilter(QObject *w, QEvent *e)
{
    if(e->type()==QEvent::MouseButtonPress){
        qDebug()<<w->objectName();//验证 w 为事件本应到达的目标对象
        qDebug()<<"A事件过滤函数";
        return 1;//返回 1 表示该事件不再进一步处理
    }
    return 0;/*返回 0 表示其余事件交还给目标对象处理,本例应返回 0,否则添加了该
过滤器的安钮会无法显示。*/
}

b.h

#ifndef B_H
#define B_H

#include "a.h"

class B : public A
{
public:
    B();

    bool eventFilter(QObject *w, QEvent *e);


};

#endif // B_H

b.cpp

#include "b.h"

B::B()
{

}

bool B::eventFilter(QObject *w, QEvent *e)
{
    if(e->type()==QEvent::MouseButtonPress){
        qDebug()<<w->objectName();
        qDebug()<<"B事件过滤函数";
        return 0;  //把事件传递给目标对象w
    }
    return 0;
}

d.h

#ifndef D_H
#define D_H

#include <QPushButton>
#include<QMouseEvent>
#include <QDebug>

class D : public QPushButton
{
public:
    D();

    void mousePressEvent(QMouseEvent *e);

};

#endif // D_H

d.cpp

#include "d.h"

D::D()
{

}

void D::mousePressEvent(QMouseEvent *e)
{
    qDebug()<<"D按下了鼠标";
}

win.h

#ifndef WIN_H
#define WIN_H

#include <QWidget>
#include <QDebug>

class Win : public QWidget
{
    Q_OBJECT

public:
    Win(QWidget *parent = nullptr);
    ~Win();

    void mousePressEvent(QMouseEvent *e);


};
#endif // WIN_H

win.cpp

#include "win.h"

Win::Win(QWidget *parent)
    : QWidget(parent)
{
}

Win::~Win()
{
}

void Win::mousePressEvent(QMouseEvent *e)
{
    qDebug()<<"win你按下了鼠标";
}

main.cpp

#include "win.h"
#include "d.h"
#include "b.h"
#include "a.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Win w;
    D* pd=new D;
    pd->setParent(&w);
    pd->setText("AAA");
    pd->move(22,22);
    D *pd1=new D;
    pd1->setParent(&w);
    pd1->setText("BBB");
    pd1->move(99,22);

    A ma;
    B mb;
    mb.setParent(&ma);

    pd->installEventFilter(&mb);//注册过滤器对象
    pd1->installEventFilter(&ma);

    ma.setObjectName("ma");
    mb.setObjectName("mb");
    w.setObjectName("mc");
     pd->setObjectName("pd");
     pd1->setObjectName("pd1");

     w.resize(300,200);

    w.show();
    return a.exec();
}

实例二:面向对象

win.h

#ifndef WIN_H
#define WIN_H

#include <QWidget>
#include <QDebug>

class Win : public QWidget
{
    Q_OBJECT

public:
    Win(QWidget *parent = nullptr);
    ~Win();

    bool eventFilter(QObject *obj, QEvent *ev); //重写事件过滤函数
};
#endif // WIN_H

win.cpp

#include "win.h"

Win::Win(QWidget *parent)
    : QWidget(parent)
{

     this->installEventFilter(this);
}

Win::~Win()
{
}

bool Win::eventFilter(QObject *obj, QEvent *ev)
{
    static int i=0;
    qDebug()<<"事件过滤函数:"<<i++;
    return 0;//交给目标对象处理
}

注意:方法一:如果只是给控件注册了过滤器,只是过滤控件

方法二:如果给QApplication安装了过滤器,那么对所有事件进行过滤

方法三:重写notify(事件分发)函数

顺序:notify(事件分发)函数-->QApplication过滤器-->控件过滤器

本文福利,费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击费领取↓↓

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值