我是靠谱客的博主 精明曲奇,最近开发中收集的这篇文章主要介绍Qt4.8与Qt5.12keyPressEvent函数差异现象分析解决方案引用,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

  • 现象
  • 分析
  • 解决方案
  • 引用

现象

最近将程序从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函数差异现象分析解决方案引用所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部