当前位置:网站首页>Qt键盘事件(二)——长按按键反复触发event事件问题解决
Qt键盘事件(二)——长按按键反复触发event事件问题解决
2022-07-24 16:18:00 【用户6557940】
引言
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键,再松开。
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节总结所言,示例代码如下:
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
边栏推荐
- Public and private key transmission, and understanding of CA certificate
- Dynamics 365: explain virtual entity from 0 to 1
- deepin任务栏消失解决方法
- Minor record
- yolov4 训练自己的数据集
- G026-db-gs-ins-03 openeuler deployment opengauss (1 active and 2 standby or multiple standby)
- Servlet框架(servlet+jsp)+Mysql实现的增删改查+分页(功能包学生信息录入、学生信息增删改查、分页等)
- 若依 this.$router.push 同地址不同参,页面不刷新问题
- Feign for 20 minutes every day
- 普林斯顿微积分读本02第一章--函数的复合、奇偶函数、函数图像
猜你喜欢

有了这个机器学习画图神器,论文、博客都可以事半功倍了!

faster-rcnn 训练自己的数据集
![[SWT] scrolling container to realize commodity list style](/img/84/07e7c794aaef3fb64f173b50150b21.png)
[SWT] scrolling container to realize commodity list style

多线程(基础)

普林斯顿微积分读本02第一章--函数的复合、奇偶函数、函数图像

如何在 PHP 中防止 XSS

Dynamics crm: mailbox configuration (III) - configure email server profiles and mailboxes

Power of leetcode 231.2

Rest style

Servlet framework (servlet+jsp) + addition, deletion, modification and query + paging implemented by MySQL (function package student information entry, addition, deletion, modification and query of st
随机推荐
From which dimensions can we judge the quality of code? How to have the ability to write high-quality code?
若依 this.$router.push 同地址不同参,页面不刷新问题
2.19 haas506 2.0开发教程 - bluetooth - 蓝牙通信(仅支持2.2以上版本)
Cache penetration, cache breakdown, cache avalanche differences and solutions [easy to understand]
3、 Set foundation ArrayList set and simple student management system
Caikeng Alibaba cloud Kex_ exchange_ identification: read: Connection reset by peer
31 next spread
Deploy ZABBIX monitoring system and email alarm mechanism in lamp architecture
Please talk about the financial products with a yield of more than 6%
REST风格
做完数据治理,质量依旧很差
PHP中array_merge的坑
【SWT】自定义数据表格
Vscode common shortcut keys
How to prevent XSS in PHP
Scala functions and their higher-order applications
Mysql8 encountered the problem of stopping after the service was started
The 3D sensing market is accelerating. Who will be better, TOF or structured light?
Will the capital market be optimistic about TCL's folding screen story?
ZBar project introduction and installation configuration| [email protected]