QDemo之按键长按

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

示意图:

QDemo之按键长按


你可能感兴趣的:(qt,QDemo,QKeyEvent,LongPress)