文档章节

QDemo之按键长按

j
 jannn
发布于 2015/10/10 16:05
字数 495
阅读 239
收藏 1
点赞 0
评论 4

简单说明下我们平时理解的KeyEvent:

  1. Press = 按键按下
  2. Release = 按键释放
  3. Click = 单击,1和2的组合情况
  4. LongPress = 长按,我平时理解的是一直在触发Press,跟2、3没有任何关系。

而Qt里的QKeyEvent有点不一样:

  1. Press = 按键按下,这个一样
  2. Release = 按键释放,这个也一样
  3. Click = 单击,这个还是一样
  4. LongPress = 长按,Qt里没有这个状态,但是有个对应功能的函数叫QKeyEvent::isAutoRepeat(),并且长按的时候会不断的重复触发1、2的状态

QKeyEvent::isAutoRepeat()返回的是个布尔型的值,

也就是说我们要通过QKeyEvent的isAutoRepeat()函数返回的true或false来判断是否是按键长按状态


例子如下:

新建项目:KeyLongPress

main.cpp就不多说了...

keyLongPress.ui是默认的,什么都没改。

//keyLongPress.h

#ifndef KEYLONGPRESS_H
#define KEYLONGPRESS_H

#include <QDebug> //别忘了我
#include <QWidget>
#include <QKeyEvent> //也别忘了我

namespace Ui {
class KeyLongPress;
}

class KeyLongPress : public QWidget
{
    Q_OBJECT

public:
    explicit KeyLongPress(QWidget *parent = 0);
    ~KeyLongPress();

protected:
    void keyPressEvent(QKeyEvent *event); //按键按下事件
    void keyReleaseEvent(QKeyEvent *event); //按键释放事件

private:
    Ui::KeyLongPress *ui;
};

#endif // KEYLONGPRESS_H
 
...
//keyLongPress.cpp

#include "keyLongPress.h"
#include "ui_keyLongPress.h"

KeyLongPress::KeyLongPress(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::KeyLongPress)
{
    ui->setupUi(this);
}

KeyLongPress::~KeyLongPress()
{
    delete ui;
}

//QMouseEvent没有isAutoRepeat()方法...无语了,
//这样有些操作就不方便实现了,
//比如长按鼠标多少秒呼出某个(登录)窗口啥的。

//! [按键按下事件-Begin]
void KeyLongPress::keyPressEvent(QKeyEvent *event)
{
    if(event->isAutoRepeat()){
        qDebug() <<  "按键长按中...";
    }
    else{
        qDebug() << "按键按下";
    }
}
//! [按键按下事件-End]

//! [按键释放事件-Begin]
void KeyLongPress::keyReleaseEvent(QKeyEvent *event)
{
    if(event->isAutoRepeat()){
        qDebug() <<  "按键不断释放...";
    }
    else{
        qDebug() << "按键释放";
    }
}
//! [按键释放事件-End]
 


运行之后,测试效果:

Click看下输出:是只有1次Press和1次Release的,

长按看下输出:是Press和Release一直在不停的输出的。

示意图:


© 著作权归作者所有

共有 人打赏支持
j
粉丝 10
博文 64
码字总数 20006
作品 0
温州
程序员
加载中

评论(4)

j
jannn

引用来自“Toxsch”的评论

长按不就应该是press(按下)不松手吗?为什么会理解成不断press(按下),你明明只press(按下)了一次啊?
isAutoRepeat如字面意思,是判断是否为自动重复的意思。而且通过属性autoRepeat能使之不起作用,即当autoRepeat属性为false时,就算你长按也不会重复触发press和release事件。这种判断方式至少不完全。
Qt中没有长按事件,如果需要可以通过press、release和timer来自行组合实现。

引用来自“ansaid”的评论

3Q,长按press平时的理解是一直处于press,文章的文字描述错了,已经修正。 我最开始的想法,就是自己组合实现,但是发现Qt里的QKeyEvent和自己理解的不一致,所以特此记录下来,此文只是针对这个的。。。 而你说的isAutoRepeat本身的使用问题上,在不做其他设置的情况下,物理状态的长按press确是体现在isAutoRepeat的返回值上,因为反过来通过isAutoRepeat的返回值来执行对应的长按press槽,本身没什么问题吧?

引用来自“Toxsch”的评论

在特定的环境下,这么做也是对的。 不过如同之前提到,这个返回是依赖你按下的键的autoRepeat属性。比如在QAbstractButton及其派生的Button类里这个属性就被置为默认false。在使用时需要注意适用场合。
Toxsch
Toxsch

引用来自“Toxsch”的评论

长按不就应该是press(按下)不松手吗?为什么会理解成不断press(按下),你明明只press(按下)了一次啊?
isAutoRepeat如字面意思,是判断是否为自动重复的意思。而且通过属性autoRepeat能使之不起作用,即当autoRepeat属性为false时,就算你长按也不会重复触发press和release事件。这种判断方式至少不完全。
Qt中没有长按事件,如果需要可以通过press、release和timer来自行组合实现。

引用来自“ansaid”的评论

3Q,长按press平时的理解是一直处于press,文章的文字描述错了,已经修正。 我最开始的想法,就是自己组合实现,但是发现Qt里的QKeyEvent和自己理解的不一致,所以特此记录下来,此文只是针对这个的。。。 而你说的isAutoRepeat本身的使用问题上,在不做其他设置的情况下,物理状态的长按press确是体现在isAutoRepeat的返回值上,因为反过来通过isAutoRepeat的返回值来执行对应的长按press槽,本身没什么问题吧?
在特定的环境下,这么做也是对的。 不过如同之前提到,这个返回是依赖你按下的键的autoRepeat属性。比如在QAbstractButton及其派生的Button类里这个属性就被置为默认false。在使用时需要注意适用场合。
j
jannn

引用来自“Toxsch”的评论

长按不就应该是press(按下)不松手吗?为什么会理解成不断press(按下),你明明只press(按下)了一次啊?
isAutoRepeat如字面意思,是判断是否为自动重复的意思。而且通过属性autoRepeat能使之不起作用,即当autoRepeat属性为false时,就算你长按也不会重复触发press和release事件。这种判断方式至少不完全。
Qt中没有长按事件,如果需要可以通过press、release和timer来自行组合实现。
3Q,长按press平时的理解是一直处于press,文章的文字描述错了,已经修正。 我最开始的想法,就是自己组合实现,但是发现Qt里的QKeyEvent和自己理解的不一致,所以特此记录下来,此文只是针对这个的。。。 而你说的isAutoRepeat本身的使用问题上,在不做其他设置的情况下,物理状态的长按press确是体现在isAutoRepeat的返回值上,因为反过来通过isAutoRepeat的返回值来执行对应的长按press槽,本身没什么问题吧?
Toxsch
Toxsch
长按不就应该是press(按下)不松手吗?为什么会理解成不断press(按下),你明明只press(按下)了一次啊?
isAutoRepeat如字面意思,是判断是否为自动重复的意思。而且通过属性autoRepeat能使之不起作用,即当autoRepeat属性为false时,就算你长按也不会重复触发press和release事件。这种判断方式至少不完全。
Qt中没有长按事件,如果需要可以通过press、release和timer来自行组合实现。
网络幻灯片--nodePPT

nodePPT 是使用nodejs写的网络幻灯片。 为什么选择nodePPT 基于GFM的markdown语法编写 支持html混排,再复杂的demo也可以做! 导出网页或者pdf更容易分享 支持18种转场动画,可以设置单页动画...

叶秀兰
2014/07/29
4.1K
1
关于处理按键长按不用onKeyLongPress的另一种解决方案

近期项目中需要处理按键长按事件,所以使用onKeyLongPress()进行了处理,但同时自己也发现了另一种处理长按的方式。首先来介绍一下使用onKeyLongPress()的相关方法。 一、onKeyLongPress使用...

明月春秋
2017/11/12
0
0
单片机中按键的短按,长按,单击,多击的驱动程序实现

接触过的按键驱动中,大部分是使用延时函数消抖,或者是在扫描到按键状态之后,直接就在按键扫描程序内部对事件进行处理。一直在思考一个不使用延时函数同时兼容性和移植性较强的按键驱动程序...

cheerk
04/12
0
0
基于状态转移的独立按键程序设计

从网上搜集而来,出处不可考。感谢原作者。 对于按键处理讲得很透彻。 从这一章开始,我们步入按键程序设计的殿堂。在基于单片机为核心构成的应用系统中,用户输入是必不可少的一部分。输入可...

memorybox
2012/08/19
0
0
[M0]配置虚拟按键是否支持长按事件

虚拟Home键布局代码: systemui:keyCode="3",表示Home键的键值是3; systemui:keyRepeat="true",表示Home键支持长按事件,false表示不支持长按。 如果想要修改虚拟按键是否支持长按事件操作...

ShawnXia
2016/08/31
27
0
最好的按键扫描和消抖方法,适用于复合、长按、按下或抬起响应按键

刚参加工作的时候,看了一些同事采用的按键扫描和消抖方法,对比学校里和网上查到的按键处理,发现觉得不尽善尽美,有以下几点: 想了很久之后,我结合PC的键盘处理方法,编写了自己的按键函...

JustLuwei1234
04/25
0
0
Android 捕获耳机按键长按事件

我实现了一个BroadCast用来监听耳机HOOK按键,然后在AndroidManifest.xml中注册。可是现在我只能监听到HOOK按键的普通点击,无法获取到长按事件,期待高手解答!...

Easince
2012/07/06
2.3K
1
C程序实现监听长按物理power键3秒关机功能

要实现的功能:在android Framework层被裁剪掉的情况下,实现监听长按的物理power按键,实现长按3秒后关机功能; 思路:使用event epoll,非阻塞式IO操作,同时避免无差别轮询,做到避免忙轮...

楼中望月
2017/11/13
0
0
Android 4.0设计规范10大改变

对比Android 4.0与Android2.3及之前版本的App设计指导,总结了Android 4.0设计的10大改变: 1. 导航栏 (详见模式PATTERNS>导航Navigation) 由之前的物理按键导航(返回、菜单、搜索、主页)变...

晨曦之光
2012/03/01
615
1
基于LWUIT实现全局按键控制(快捷键)

越往LWUIT框架深入,就发现LWUIT里面有很多好玩的东西。今天要介绍的是,是个类似快捷键的东西:你可以在程序的任何地方触发你预先设计好的按键处理,例如你的程序有4个Form,那么在这4个For...

晨曦之光
2012/03/14
148
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

sklearn学习笔记之简单线性回归

简单线性回归 线性回归是数据挖掘中的基础算法之一,从某种意义上来说,在学习函数的时候已经开始接触线性回归了,只不过那时候并没有涉及到误差项。线性回归的思想其实就是解一组方程,得到...

wangxuwei
7分钟前
0
0
feign之动态interceptor(二)

背景 上文提到了按照不同的feignClient可以根据多个不同的key来进行多个不同的bean的配置 那么我们如何完成多个interceptor的配置呢? 分析 我们刚提到多个配置的玄机就在FeignClientProper...

Mr_Qi
9分钟前
1
0
Linux Kernel 4.16 系列停止维护,用户应升级至 4.17

知名 Linux 内核维护人员兼开发人员 Greg Kroah-Hartman 近日在发布 4.16.18 版本的同时,宣布这是 4.16 系列的最后一个维护版本,强烈建议用户立即升级至 4.17 系列。 Linux 4.16 于 2018 年...

问题终结者
34分钟前
0
0
Apache配置时.htaccess失效不起作用的原因分析

.htaccess 失效的原因 1. 重写规则有问题,检查自己的重写规则 2.Apache配置问题,配置中没有配置启用 rewrite a2enmod rewrite 3.网站配置文件没有启用配置需要配置 000-default.conf <Dire...

TU-DESGIN
54分钟前
1
0
两个求最大公约数C/C++算法实现

#include<stdio.h> #include<time.h> #include <iostream>using namespace std;//求最大公约数 LCD(Largest Common Division)//短除法 //m=8251, n=6105; int LCD_ShortDiv(int m, ......

失落的艺术
今天
1
0
QueryPerformanceCounter

windows的Sleep函数,睡眠线程指定毫秒数,可以用来做毫秒延时。 对于微秒延时,没有一个现成的函数,但是可以通过 QueryPerformanceFrequency QueryPerformanceCounter 来间接实现。原理就是...

开飞色
今天
1
0
log4j2使用AsyncRoot不显示行号问题处理

<AsyncRoot level="info" includeLocation="true"> <AppenderRef ref="File"/></AsyncRoot><!--1.异步logger,还需要在pom.xml中添加disruptor的依赖。2.includeLocation结合异......

小翔
今天
3
0
安卓手机上 K 歌,声音延迟怎么解决?

这篇文章可以为你提供一个解决录音和播放同步问题的思路,而且解决了声音从手机传输到耳机上有延时的问题。 初识音频 在开始之前,我先简单介绍一下音频相关的基础知识,方便下文理解。 我们...

编辑部的故事
今天
2
0
使用token实现在有效期内APP自动登录功能

使用token实现在有效期内APP自动登录功能 http://sevennight.cc/2016/07/19/auto_login_impl.html

风云海滩
今天
3
0
Spring Boot集成RabbitMQ发送接收JSON

默认情况下RabbitMQ发送的消息是转换为字节码,这里介绍一下如何发送JSON数据。 ObjectMapper 最简单发送JSON数据的方式是把对象使用ObjectMapper等JSON工具类把对象转换为JSON格式,然后发送...

小致dad
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部