概述
文章目录
- 现象
- 分析
- 解决方案
- 引用
现象
最近将程序从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,如果对象A重载了eventFilter虚函数,通过B.installEventFilter(&A)便可以将发往对象B的事件先发往对象A,由对象A先处理。
在A的eventFilter中,对B的某种事件,如果A希望截获,则可以先处理,然后返回true(表示不希望该事件继续传播);如果A不关心,则返回false。
相关函数:virtual bool eventFilter(QObject * watched, QEvent * event); //watched表示事件源,当过滤多个对象的事件时,可用于过滤;
installEventFilter(this) //添加事件过滤器
示例代码:
bool CDeviceConfig::eventFilter(QObject * watched, QEvent * event)
{
#if (QT_VERSION < QT_VERSION_CHECK(5,0,0))
if (nullptr != dynamic_cast<QWidget*>(watched)) {
if (event->type() == QEvent::KeyPress) {
QKeyEvent *keyEvent = static_cast<QKeyEvent*>(event);
keyPressEvent(keyEvent);
return true;
} else {
return false;
}
} else {
return QMainWindow::eventFilter(watched, event);
}
#else
return QMainWindow::eventFilter(watched, event);
#endif
}
引用
qt事件传递过程和处理
最后
以上就是精明曲奇为你收集整理的Qt4.8与Qt5.12keyPressEvent函数差异现象分析解决方案引用的全部内容,希望文章能够帮你解决Qt4.8与Qt5.12keyPressEvent函数差异现象分析解决方案引用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复