现象
最近将程序从x86_64 Qt5.12向arm Qt4.8环境上迁移时,遇到上下键导航焦点在4.8下不起作用的情况。
基本场景如下:在窗体Widget中包含若干按钮,依次为button1, button2, button3,默认button1存在焦点,按下上/下键后,焦点会在这三个按钮上来回切换。
Qt5.12实现方案:
1)在按钮类中重载 virtual void keyPressEvent(QKeyEvent *event); 对于上/下键,event->setAccepted(false);使其向父窗口传递。
2)在窗体类中重载 virtual void keyPressEvent(QKeyEvent *event); 对于上/下键,触发焦点切换。
分析
arm 4.8环境下,调试发现父窗体始终未收到上下键事件。
该开始怀疑键值不正确,打印发现键值不存在问题。
后来在按钮类中,不处理上/下键,采用QPushButton默认的keyPressEvent处理,效果和修改前是一样的。所以推测,在QPushButton的基类中,可能某个类对上/下键做了处理,导致该事件未被发送到父窗体。
所以问题变为:如何让上/下键事件不被QPushButton的基类处理呢?
后来在qt事件传递过程和处理发现事件过滤器。
解决方案
事件过滤器的基本使用场景:
对象A和对象B均继承于QObject&#x