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