文档章节

QDemo之按键长按

j
 jannn
发布于 2015/10/10 16:05
字数 495
阅读 255
收藏 1

简单说明下我们平时理解的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
博文 66
码字总数 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使用...

明月春秋
10/29
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

没有更多内容

加载失败,请刷新页面

加载更多

EOS官方钱包keosd

EOS官方钱包的名称是keosd,它负责管理你的私钥,并且帮你进行交易的签名。 不过不幸的是,keosd钱包对普通用户并不友好,它是一个命令行程序,目前还没有像以太坊的mist那样的图形化界面,而...

汇智网教程
21分钟前
1
0
ArrayList的实现原理以及实现线程安全

一、ArrayList概述 ArrayList是基于数组实现的,是一个动态的数字,可以自动扩容。 ArrayList不是线程安全的,效率比较高,只能用于单线程的环境中,在多线程环境中可以使用Collections.syn...

一看就喷亏的小猿
37分钟前
2
0
Netty 备录 (一)

入职新公司不久,修修补补1个月的bug,来了点实战性的技术---基于netty即时通信 还好之前对socket有所使用及了解,入手netty应该不是很难吧,好吧,的确有点难,刚看这玩意的时候,可能都不知道哪里...

_大侠__
昨天
4
0
Django简单介绍和用户访问流程

Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。 Django是一个开放源代码的Web应用框架,由Python写成。 Django遵守BSD版权,初...

枫叶云
昨天
8
0
Spring Cloud Stream消费失败后的处理策略(四):重新入队(RabbitMQ)

应用场景 之前我们已经通过《Spring Cloud Stream消费失败后的处理策略(一):自动重试》一文介绍了Spring Cloud Stream默认的消息重试功能。本文将介绍RabbitMQ的binder提供的另外一种重试...

程序猿DD
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部