Qt Line Edit焦点丢失|Checkbox转移焦点丢失
在我设计的一个界面中,用事件过滤器获取键盘方向键,通过键盘方向键转移控件的焦点,获取焦点的控件显示高亮,在从一个Checkbox控件转移焦点到一个Line Edit控件的时候,该获得焦点的控件并没有显示高亮,并且根据后续操作推测焦点消失了,通过qDebug调试发现转移焦点后的那一瞬间,Line Edit控件确实有获得焦点,只是不知道为什么没有显示高亮,并且焦点似乎是立刻消失了
解决方法:
在每个分支里加上return true
后面学了事件传递流程,推测一下原理:
最后return父类的eventFilter在Qt里的定义是直接返回false,即如果函数里没有return true的话,最后都会return false,让事件继续传递下去,在控件比较多比较复杂的窗体中,事件产生后就会一层一层向父类传递下去,因为没有指定事件传递的终点,事件可能会在传递的过程中丢失,而焦点一般是和事件相联系的,所以事件传丢之后焦点也丢了
回想之前做过的其它练习,项目中如果添加了事件过滤器,但在事件过滤函数里没有return true的,虽然程序可以正常运行,最后手动关掉窗口的时候会有弹窗
推测是因为没有设置事件传递的终点,事件一旦产生就会一直传递,相当于是一个死循环,由于一个项目运行的时候往往会产生很多事件,对于结构比较简单的项目,事件能传递的路径比较短,出问题可能不易察觉,对于结构比较复杂的项目,问题就比较容易体现出来
我们通过事件过滤器获取事件的时候,一般只是获取某个控件发生的事件并做出相应的处理,处理之后这个事件就没什么用了,我们也不关心它会传递到哪个父控件,所以可以在获取到指定事件并做出相应的反应后return true,阻止事件继续传递下去