Qt Line Edit焦点丢失|Checkbox转移焦点丢失

在我设计的一个界面中,用事件过滤器获取键盘方向键,通过键盘方向键转移控件的焦点,获取焦点的控件显示高亮,在从一个Checkbox控件转移焦点到一个Line Edit控件的时候,该获得焦点的控件并没有显示高亮,并且根据后续操作推测焦点消失了,通过qDebug调试发现转移焦点后的那一瞬间,Line Edit控件确实有获得焦点,只是不知道为什么没有显示高亮,并且焦点似乎是立刻消失了

解决方法:

在每个分支里加上return true

后面学了事件传递流程,推测一下原理:

最后return父类的eventFilter在Qt里的定义是直接返回false,即如果函数里没有return true的话,最后都会return false,让事件继续传递下去,在控件比较多比较复杂的窗体中,事件产生后就会一层一层向父类传递下去,因为没有指定事件传递的终点,事件可能会在传递的过程中丢失,而焦点一般是和事件相联系的,所以事件传丢之后焦点也丢了

回想之前做过的其它练习,项目中如果添加了事件过滤器,但在事件过滤函数里没有return true的,虽然程序可以正常运行,最后手动关掉窗口的时候会有弹窗

推测是因为没有设置事件传递的终点,事件一旦产生就会一直传递,相当于是一个死循环,由于一个项目运行的时候往往会产生很多事件,对于结构比较简单的项目,事件能传递的路径比较短,出问题可能不易察觉,对于结构比较复杂的项目,问题就比较容易体现出来

我们通过事件过滤器获取事件的时候,一般只是获取某个控件发生的事件并做出相应的处理,处理之后这个事件就没什么用了,我们也不关心它会传递到哪个父控件,所以可以在获取到指定事件并做出相应的反应后return true,阻止事件继续传递下去

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值