Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Qt键盘事件(二)——长按按键反复触发event事件问题解决

Qt键盘事件(二)——长按按键反复触发event事件问题解决

作者头像
用户6557940
发布于 2022-07-24 07:25:25
发布于 2022-07-24 07:25:25
4.4K00
代码可运行
举报
文章被收录于专栏:Jungle笔记Jungle笔记
运行总次数:0
代码可运行

引言

Qt键盘事件可能会遇到无法响应方向键、一直产生按下或者释放事件等问题,如何解决呢?Jungle笔记为您解答。

01

问题描述

在Jungle的上一篇文章中(Qt键盘事件(一)——检测按键输入),Jungle简单实现了利用qt检测用户按键操作并将键按下\释放操作打印在Qt界面上的一个小程序。但是在测试过程中会出现一个现象,那就是长按某个键不放,界面一直在刷新press、release、press、release……(如下图)

也就是说,在长按某个键不释放的情况下,keyPressEvent和keyReleaseEvent事件会不断被触发。尽管这是Qt设计实现好的事件机制,但在用户体验上,这是不合常理的。我们希望实现的是:按下某个键(比如Tab键),界面只打印一次"Key_Tab Press";当手松开时,界面上才打印"Key_Tab Release"

02

问题说明

为此,Jungle查询了Qt官方文档和几篇博客。官方文档上提到一个QKeyEvent的成员函数isAutoRepeat:

可以看到,当event来自于auto-repeating key,isAutoRepeat返回true;当event事件来自于最初的按键,则sAutoRepeat返回false。这么说可能不好理解,那不妨Jungle做个小测试:

在keyPressEvent里打印isAutoRepeat返回值

操作:长按Tab键,在keyPressEvent里打印isAutoRepeat返回值,松开Tab键后,再次长按Tab键,再松开。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void QKeyBoard::keyPressEvent(QKeyEvent *event){
  switch(event->key()){
    case Qt::Key_Tab:
      if(event->isAutoRepeat()==true){
        this->ui.textEdit_press->append("true");
      }
      else{
        this->ui.textEdit_press->append("false");
      }
      this->ui.textEdit_press->append("Key_Tab Press");
      break;
    /*default:
      this->ui.textEdit->append("KeyEvent");*/
  }
}

测试结果如下图:

从测试结果可以看到,长按下Tab键第一次触发keyPressEvent事件时isAutoRepeat返回false,之后长按过程中isAutoRepeat返回值均为true。松键后再次长按,isAutoRepeat返回false,之后长按过程中isAutoRepeat返回值均为true。即只有首次按下Tab键时,isAutoRepeat返回值为false。结合这个结果来看Qt官方文档的描述,似乎更好理解一点。

在keyReleaseEvent里打印isAutoRepeat返回值

同样,Jungle在keyReleaseEvent里打印isAutoRepeat返回值,运行结果如上图(代码略)。可以看到,长按下Tab键,自动触发keyReleaseEvent事件时isAutoRepeat返回true,真正松键后触发keyReleaseEvent事件时isAutoRepeat返回true

测试总结

结合Qt官方文档和上述测试,可以得出如下结论:

  • 按键触发的keyPressEvent事件,isAutoRepeat返回false;自动触发的keyPressEvent事件,isAutoRepeat返回true;
  • 松键触发的keyReleaseEvent事件,isAutoRepeat返回true;自动触发的keyReleaseEvent事件,isAutoRepeat返回false。

03

问题解决

在真正按键和松键事件触发时,加上对isAutoRepeat返回值的判断,具体判断如第2节总结所言,示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void QKeyBoard::keyPressEvent(QKeyEvent *event){
  switch(event->key()){
    case Qt::Key_Tab:
      if(!event->isAutoRepeat()){
        this->ui.textEdit_press->append("Key_Tab Press");
                /* add your code here*/
      }
      break;
  
    /*default:
      this->ui.textEdit->append("KeyEvent");*/
  }
}
 
void QKeyBoard::keyReleaseEvent(QKeyEvent *event){
  switch(event->key()){
    case Qt::Key_Tab:
      if(!event->isAutoRepeat()){
        this->ui.textEdit_release->append("Key_Tab Release");
                /* add your code here*/
      }
      break;
    /*default:
      this->ui.textEdit->append("KeyEvent");*/
  }
}

在某些博客里,作者可能增设了某个变量来标记键是否被按下,并在按下和松键时更新标记。但Jungle认为并没有必要,像上述那样加入判断即可。相关代码请访问Jungle的GitHub主页:https://github.com/FengJungle/Qt_Project

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Jungle笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Qt键盘事件(一)——检测按键输入
本节Jungle实现一个简单的功能:键盘按下某个键,Qt界面上显示出Jungle按下的是哪个键。
用户6557940
2022/07/24
3.2K0
Qt键盘事件(一)——检测按键输入
[QT]响应键盘事件(附虚拟键值转换函数)
原文链接:https://blog.csdn.net/humanking7/article/details/80700233
祥知道
2020/03/10
3.4K0
Qt设计机器人仿真控制器——按键控制机器人关节转动
在上两篇博客里,Jungle介绍了Qt键盘事件,并在小程序中应用Qt键盘事件监测按键输入:
用户6557940
2022/07/24
1.1K0
Qt设计机器人仿真控制器——按键控制机器人关节转动
17.QT-事件处理分析、事件过滤器、拖放事件
Qt事件处理介绍 Qt平台会将系统产生的消息转换为Qt事件 Qt事件是一个QEvent的对象 Qt事件用来描述程序内部或外部发生的动作 任意的QObject对象都具备事件处理的能力 Qt常见的事件继承
诺谦
2018/05/28
1.6K0
【QT】鼠标按键事件 - QMouseEvent & QKeyEvent
事件是应用程序内部或者外部产生的事情或者动作的统称。在 Qt 中使用⼀个对象来表⽰⼀个事件。所有的 Qt 事件均继承于抽象类 QEvent。事件是由系统或者 Qt 平台本⾝在不同的时刻发出的。当用户按下⿏标、敲下键盘,或者是窗⼝需要重新绘制的时候,都会发出⼀个相应的事件。⼀些事件是在用户操作时发出,如键盘事件、⿏标事件等,另⼀些事件则是由系统本⾝⾃动发出,如定时器事件。常见的 Qt 事件如下:
YoungMLet
2024/07/20
1.1K0
【QT】鼠标按键事件 - QMouseEvent & QKeyEvent
Qt5实战第十篇:Qt5事件处理详解
Qt5事件处理机制是Qt框架的核心之一,它允许应用程序响应用户的交互动作,如鼠标点击、键盘输入等。事件处理在Qt中是通过事件对象、事件源、事件目标以及事件处理函数来实现的。了解并掌握Qt5的事件处理机制,对于开发高效、响应迅速的GUI应用程序至关重要。
china马斯克
2025/01/03
2760
【QT】事件系统入门——QEvent 基础与示例
事件本身是 操作系统提供的 机制,Qt 也同样把操作系统事件机制进行了封装拿到了 Qt 中,但由于 事件 对应的代码编写起来不方便,因此 Qt 对于事件机制 又进行了进一步的 封装,就得到了 信号槽
IsLand1314
2025/03/14
1400
【QT】事件系统入门——QEvent 基础与示例
【QT】Qt事件
事件是应用程序内外部产生的事情以及动作的统称,常见的所有事件例如鼠标事件QMouseEvent,键盘事件QKeyEvent等等都是继承自QEvent
s-little-monster
2024/11/06
2480
【QT】Qt事件
C++ Qt开发:Charts折线图绑定事件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍QCharts折线图的常用方法及灵活运用。
王瑞MVP
2023/12/25
5970
C++ Qt开发:Charts折线图绑定事件
Qt事件系统与应用举例
在Qt中,事件都是从抽象类QEvent派生出来的对象。它们表示发生在应用程序内部或由于应用程序需要了解的外部活动而发生的事情。 事件可以由QObject子类的任何实例接收和处理,但它们与小部件尤其相关。 本文档介绍了在典型应用程序中如何传递和处理事件。
用户5908113
2020/05/07
1.7K0
[QT]获取鼠标坐标以及按键响应
原文链接:https://blog.csdn.net/humanking7/article/details/80707591
祥知道
2020/03/10
4.6K0
浅谈基于QT的截图工具的设计与实现
在介绍截图工具设计与实现前,让我们先通过介绍QT的绘图基础知识,让读者有一个比较感性的认识。
w4ngzhen
2023/10/18
5340
浅谈基于QT的截图工具的设计与实现
【QT】QT事件处理
QT中,事件作为一个对象,继承自QEvent类,常见的有键盘事件QKeyEvent、鼠标事件QMouseEvent和定时器事件QTimerEvent等。QT中,任何QObject子类示例都可以接收和处理事件。实际编程中通常实现部件的paintEvent()、mousePressEvent()等事件处理函数来处理特定部件的特定事件。
半生瓜的blog
2023/05/13
1.6K0
【QT】QT事件处理
[QT]屏蔽Tab键切换控件焦点
原文链接:https://blog.csdn.net/humanking7/article/details/80654775
祥知道
2020/03/10
2K0
Qt 项目之虚拟键盘 V1.0
一般我在做一个东西之前会上网查找资料,看下有几种实现的方式。在Qt下开发虚拟键盘总体上可分为两种方式——进程内部和进程外部。
用户5908113
2019/09/24
3K0
Qt 项目之虚拟键盘 V1.0
Qt官方示例-图表缩放
  然后,我们为鼠标和按键事件实现自定义逻辑。例如,按"+"键将放大,而按"-"键将缩小。
Qt君
2020/07/02
2.1K0
项目实战——Qt实现FFmpeg音视频转码器
1、首先创建一个 Qt 项目,选择 MSVC2017 32bit 作为其编译器
Gnep@97
2024/01/23
7670
项目实战——Qt实现FFmpeg音视频转码器
Qt 常用类 (9)—— QWidget
http://blog.csdn.net/hmsiwtv/article/details/7562015
bear_fish
2018/09/20
3.7K0
Qt 常用类 (9)—— QWidget
Qt软键盘-发送按键事件
发送按键事件到当前聚焦的窗体。 1.获取当前聚焦的QWidget QWidget *receiver = QApplication::focusWidget(); qDebug()<<"Send key event to focus widget "<<receiver->objectName(); 2.装载press与release事件 key为按键键值(整型); value为按键实际值(QString). QKeyEvent keyPress(QEvent::KeyPress, key, Qt:
Qt君
2019/07/15
3K0
【C++】Qt:Qt事件介绍与正弦曲线绘制示例
Qt 的事件机制是一种基于事件驱动的机制,用于处理用户输入、系统事件和自定义事件。
DevFrank
2024/07/24
3400
【C++】Qt:Qt事件介绍与正弦曲线绘制示例
相关推荐
Qt键盘事件(一)——检测按键输入
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验