zoukankan      html  css  js  c++  java
  • Qt keyPressEvent keyReleaseEvent 分析

    最近使用Qt时,在增加一个按下某键(M),临时显示图层,键(M)弹起时隐藏图层的功能时,碰到了一些问题: keyPressEvent 事件不响应

    这个问题,网上搜到的结果是可能是控件没获取焦点,比如QPushButton一直占着焦点,可是界面上并没有焦点,而且,在keyPressEvent 和keyReleaseEvent 中同时打出日志,keyReleaseEvent 里面是可以响应的

    最后找出来结果是因为在其余地方使用了快捷键,代码如下:

    test::test()
    {
        QShortcut* shortcut = new QShortcut(QString("M"),this);
        QObject::connect( shortcut ,&QShortcut::activated,[=]{
            qDebug()<<"shortcut";
        });
    }
    
    void test::keyPressEvent (QKeyEvent* event)
    {
        qDebug()<<"keyPressEvent ";
    }
    void test::keyReleaseEvent (QKeyEvent* event)
    {
        qDebug()<<"keyReleaseEvent ";
    }
    

    按M的时候输出:

    shortcut--------------->按下
    keyReleaseEvent 
    shortcut
    keyReleaseEvent 
    shortcut
    keyReleaseEvent 
    ...
    shortcut
    keyReleaseEvent ----->弹起
    

    也就是说设置快捷键之后,是无法触发keyPressEvent 事件的

    如果想去掉中间重复的这部分,可以这样(网上搜索说是要自己设置flag,额,我没设置flag,好像也没什么问题)

    test::test()
    {
        QShortcut* shortcut = new QShortcut(QString("M"),this);
        shortcut ->setAutoRepeat(false);
        QObject::connect( shortcut ,&QShortcut::activated,[=]{
            qDebug()<<"shortcut";
        });
    }
    
    void test::keyReleaseEvent (QKeyEvent* event)
    {
       if(event->isAutoRepeat())
          event->ignore();
       else
          qDebug()<<"keyReleaseEvent ";
    }
    

    这样输出变为

    shortcut --------------->按下
    keyReleaseEvent  ------->弹起
    
  • 相关阅读:
    MySQL启动和关闭命令总结
    MySQL数据库5.6版本首次安装Root密码问题
    tomcat 9性能调优注意事项
    扫除减脂之路上的几个小障碍
    MySQL常见面试题
    关于邮箱发送邮件二之附件及图片
    关于邮箱发送邮件
    关于算法
    python中常见的数据类型
    C++实现复数类的输入输出流以及+-*/的重载
  • 原文地址:https://www.cnblogs.com/huqi-code/p/10002567.html
Copyright © 2011-2022 走看看