qt5--键盘事件

需要 #include<QKeyEvent>

常用操作

win.h

#ifndef WIN_H
#define WIN_H

#include <QWidget>
#include <QDebug>
#include<QKeyEvent>  //键盘模块

class Win : public QWidget
{
    Q_OBJECT

public:
    Win(QWidget *parent = nullptr);
    ~Win();

    void keyPressEvent(QKeyEvent *ev); //键盘按下事件

};
#endif // WIN_H

win.cpp

#include "win.h"

Win::Win(QWidget *parent)
    : QWidget(parent)
{
}

Win::~Win()
{
}

void Win::keyPressEvent(QKeyEvent *e)
{
int key=e->key();  //返回触发事件键的键值
//大写字母的ASCii吗
//不加shift键的ASCii吗

static int i=0;
//一个普通键
if(e->key() == Qt::Key_F5){  //如果按下的是F5键
    //按键详情:https://blog.csdn.net/weixin_42692504/article/details/95116279
    qDebug()<<"F5:"<<i;
}

//两键组合
if(e->modifiers() == Qt::ControlModifier){ //如果按下了CTRL键
       if(e->key() == Qt::Key_M){
           qDebug()<<"CTRL+m:"<<i;
       }
    }

if(e->modifiers() == Qt::AltModifier){ //如果按下了ALT键
       if(e->key() == Qt::Key_M){
           qDebug()<<"ALT+m:"<<i;
       }
    }

if(e->modifiers() == Qt::ShiftModifier){ //如果按下了Shift键
       if(e->key() == Qt::Key_M){
           qDebug()<<"Shift+m:"<<i;
       }
    }

//三键组合Shift + Ctrl + A的实现
if (e->modifiers() == (Qt::ShiftModifier | Qt::ControlModifier) && e->key() == Qt::Key_A)
      {
          qDebug()<<"CTRL+Shift+a:"<<i;
      }



//qDebug()<<key;
i++;
QWidget::keyPressEvent(e);   //保存默认事件
}

main.cpp

#include "win.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Win w;
    w.show();
    return a.exec();
}

以上工程下载地址:链接:https://pan.baidu.com/s/1g6nUHEoGVhDQC7dLrJlLtg    提取码:6666   

 

 

按键与自动重复

自动重复是指按下键盘上的键(修饰键除外)不放时,会不断重复的发送键按下事件,Qt 默认是启用自动重复的,若要实现类似按键 A+D 之类的快捷键,就需要关闭自动重复。可使用如下方法来关闭自动重复
if( QKeyEvent::isAutoRepeat() ) return; // 若自动重复则什么也不做
 

Qt的键盘事件整体表现为,按住一个键时:
1、第一次触发keyPressEvent(), isAutoRepeat()返回false

2、没有触发keyReleaseEvent(),停顿一会

3、再一次触发keyPressEvent(),isAutoRepeat()返回true

4、触发keyReleaseEvent()

5、若没松开按键,isAutoRepeat()返回true,返回第3步;若松开按键,isAutoRepeat()返回false

 

实例

win.h

#ifndef WIN_H
#define WIN_H

#include <QWidget>
#include <QDebug>
#include <QKeyEvent>

class Win : public QWidget
{
    Q_OBJECT

public:
    Win(QWidget *parent = nullptr);
    ~Win();

    void keyPressEvent(QKeyEvent *e); //键盘按下事件
    void keyReleaseEvent(QKeyEvent *e); //键盘释放事件

};
#endif // WIN_H

win.cpp

#include "win.h"

Win::Win(QWidget *parent)
    : QWidget(parent)
{
}

Win::~Win()
{
}

void Win::keyPressEvent(QKeyEvent *e)
{
    static int i=0;
    if (e->key() == Qt::Key_Up){
        //避免自动重复,按键重复时return;
        if (e->isAutoRepeat()){return;}
        //isAutoRepeat()  返回是不是重复按住的事件
    }

    qDebug()<<"键盘按下事件:"<<i;
    i++;
}

void Win::keyReleaseEvent(QKeyEvent *e)
{
    static int ii=0;
    if (e->key() == Qt::Key_Up){
        //避免自动重复,按键重复时return;
        if (e->isAutoRepeat()){return;}
        //isAutoRepeat()  返回是不是重复按住的事件
    }

    qDebug()<<"键盘释放事件:"<<ii;
    ii++;
}

main.cpp

#include "win.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Win w;
    w.show();
    return a.exec();
}

上面工程下载地址:链接:https://pan.baidu.com/s/17XlqMD5o4J5bCVkTTNMhzw   提取码:6666  

 

键盘捕获

mybutton.h

#ifndef MYBUTTON_H
#define MYBUTTON_H

#include <QPushButton>
#include <QDebug>
#include <QKeyEvent>

class mybutton : public QPushButton
{
public:
    mybutton();

    void keyPressEvent(QKeyEvent *e);
};

#endif // MYBUTTON_H

mybutton.cpp

#include "mybutton.h"

mybutton::mybutton()
{

}

void mybutton::keyPressEvent(QKeyEvent *e)
{
 static int i=0;
 qDebug()<<"button键盘按键事件:"<<this->objectName()<<i;
 QWidget* ww= keyboardGrabber();//返回正在捕获键盘输入的部件,若没有则返回 0
 //QPushButton(0x33fcba8)
 qDebug()<<"正在捕获的控件:"<<ww;
 if(e->key() == Qt::Key_Q){  //如果按下的是Q键
     qDebug()<<"按下了Q键";
     this->releaseKeyboard();   //释放捕获的键盘输入
  }
i++;
}

win.h

#ifndef WIN_H
#define WIN_H

#include <QWidget>
#include "mybutton.h"
#include <QDebug>

class Win : public QWidget
{
    Q_OBJECT

public:
    Win(QWidget *parent = nullptr);
    ~Win();

    void keyPressEvent(QKeyEvent *e);
private:
    mybutton* button;
    mybutton* button1;

};
#endif // WIN_H

win.cpp

#include "win.h"

Win::Win(QWidget *parent)
    : QWidget(parent)
{
    this->resize(300,400);
    button=new mybutton();
    button->setParent(this);
    button->setText("AAA");
    button->move(10,10);
    button->resize(100,100);
    button->setObjectName("aaa");

    button1=new mybutton();
    button1->setParent(this);
    button1->setText("BBB");
    button1->move(150,10);
    button1->resize(100,100);
    button1->setObjectName("bbb");

    button->grabKeyboard();//指定控件捕获键盘
    /*使按钮 AAA 捕获键盘,此时产生的键盘事件都只会发送给按钮 AAA,也就是说
        其他部件无法获得键盘事件。
        只有可见的部件才能捕获键盘输入,若 isVisible()返回 false,则该部件不能调用grabKeyboard()函数
*/
}

Win::~Win()
{
}

void Win::keyPressEvent(QKeyEvent *e)
{
qDebug()<<"win键盘事件";
}

main.cpp

#include "win.h"

#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Win w;
    w.show();
    return a.exec();
}

上面工程下载地址:链接:https://pan.baidu.com/s/1S4NTFumnZFtHCW9YJ9i3-w     提取码:6666  

 

 

 

 

 

 

posted @ 2020-09-25 13:59  天子骄龙  阅读(1480)  评论(0编辑  收藏  举报