QDemo之按鍵長按

簡單說明下咱們平時理解的KeyEvent:

  1. Press = 按鍵按下
  2. Release = 按鍵釋放
  3. Click = 單擊,1和2的組合狀況
  4. LongPress = 長按,我平時理解的是一直在觸發Press,跟二、3沒有任何關係。

而Qt裏的QKeyEvent有點不同:

  1. Press = 按鍵按下,這個同樣
  2. Release = 按鍵釋放,這個也同樣
  3. Click = 單擊,這個仍是同樣
  4. LongPress = 長按,Qt裏沒有這個狀態,可是有個對應功能的函數叫QKeyEvent::isAutoRepeat(),而且長按的時候會不斷的重複觸發一、2的狀態

QKeyEvent::isAutoRepeat()返回的是個布爾型的值, 函數

也就是說咱們要經過QKeyEvent的isAutoRepeat()函數返回的true或false來判斷是不是按鍵長按狀態


例子以下:

新建項目:KeyLongPress 測試

main.cpp就很少說了... ui

keyLongPress.ui是默認的,什麼都沒改。 this

//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的, spa

長按看下輸出:是Press和Release一直在不停的輸出的。 code

示意圖: 事件

相關文章
相關標籤/搜索