qt5--键盘事件_#include

需要 #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   

qt5--键盘事件_#define_02

按键与自动重复

自动重复是指按下键盘上的键(修饰键除外)不放时,会不断重复的发送键按下事件,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