QDemo之按键长按
博客专区 > jannn 的博客 > 博客详情
QDemo之按键长按
jannn 发表于2年前
QDemo之按键长按
  • 发表于 2年前
  • 阅读 225
  • 收藏 1
  • 点赞 0
  • 评论 4

新睿云服务器60天免费使用,快来体验!>>>   

摘要: Qt里的QKeyEvent跟我们平时理解有点不一致,导致一直实现不了按键长按效果,整明白了,留爪。

简单说明下我们平时理解的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一直在不停的输出的。

示意图:


  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 10
博文 64
码字总数 20006
评论 (4)
Toxsch
长按不就应该是press(按下)不松手吗?为什么会理解成不断press(按下),你明明只press(按下)了一次啊?
isAutoRepeat如字面意思,是判断是否为自动重复的意思。而且通过属性autoRepeat能使之不起作用,即当autoRepeat属性为false时,就算你长按也不会重复触发press和release事件。这种判断方式至少不完全。
Qt中没有长按事件,如果需要可以通过press、release和timer来自行组合实现。
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来自行组合实现。

引用来自“ansaid”的评论

3Q,长按press平时的理解是一直处于press,文章的文字描述错了,已经修正。 我最开始的想法,就是自己组合实现,但是发现Qt里的QKeyEvent和自己理解的不一致,所以特此记录下来,此文只是针对这个的。。。 而你说的isAutoRepeat本身的使用问题上,在不做其他设置的情况下,物理状态的长按press确是体现在isAutoRepeat的返回值上,因为反过来通过isAutoRepeat的返回值来执行对应的长按press槽,本身没什么问题吧?
在特定的环境下,这么做也是对的。 不过如同之前提到,这个返回是依赖你按下的键的autoRepeat属性。比如在QAbstractButton及其派生的Button类里这个属性就被置为默认false。在使用时需要注意适用场合。
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。在使用时需要注意适用场合。
×
jannn
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: