Qt eventFilter() 使用方法,以及事件传递流程

例如对象Widget中有一个对象Button,那么点击Button时QEvent* event怎么传递
不讨论基类的情况,不使用eventFilter的情况,不讨论QCoreApplication::notify()的情况下,
点击Button,event首先传递到Button的event()处理,再分发给mouseCilckEvent()处理,
再传递给其父组件Widget的event()处理,在分发给它的mouseClickEvent()处理。

为什么要安装eventFliter,如果我不想让Button接收单击信号怎么办,
如果这个Button是使用的自定义子类生成的,那么可以去重写它的event(),
如果Button直接使用的QPushButton不能重写event(),这个时候不接受信号的处理就只能交给其他组件做了,
可以把这些处理放到它的父组件Widget中处理,当然这里的Widget的类一定是自己定义的子类,这样才能重写eventFilter()。
注意其实Button的事件过滤可以放到任意一个你自定义的可以重写eventFilter中,这里放到父组件中这是比较清晰,
另外安装多个事件过滤器也是可以的。

怎么安装事件过滤器
1.Button.installEventFilter(this);//this是Widget指针
2.重写Widget的bool eventFilter(QObject* obj, QEvent* event)

增加事件过滤器QEvent的传递的改变
QEvent* event首先传递给Button,Button安装了事件过滤器,通过指针找到这个过滤器安装在Widget上,把event和Button自身的指针都当做参数传递给Widget的eventFliter处理,处理结果返回值被Button收到,为true说明被过滤了,那么Button就不把这个event给event()处理了直接结束了,如果返回值为false,那么就交给Button的event()处理,然后再分发到MouseClickEvent()处理,在传递给WIdget的event()处理,在分发给它的MouseCIickEvent()处理。

eventFliter(QObject* obj, QEvent* event)函数中具体怎么处理
首先可以通过obj判断是谁传递的事件,例如Widget有一个私有成员QPushButton* Button,那么可以判断obj == Button?,如果是Widget构造函数里临时new出来的,可以给Button->setObjectName(“button1“),取个名字判断一下也可以,然后给对应的对象做不同的处理,想过滤掉就return ture,不想过滤就return false。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值