头文件:#include
构造函数为:
但一般不会手动去创建键盘对象
count() | 返回事件涉及的按键格式 |
key() | 返回按下的键的代码 |
matches() | 判断是否与标准键匹配 |
modifiers() | 返回事件发生后立即存在的键盘修饰符标志(用于判断组合键) |
isAutoRepeat() | 返回如果此事件来自自动重复键;返回如果它来自初始按键 |
key()常用的键:很多就不一 一列举了
Qt::Key_Return | 回车键 |
Qt::Key_Tab | table键 |
Qt::Key_Escape | Esc键 |
Qt::Key_Enter | 数字键盘上的回车 |
Qt::Key_Delete | 删除键 |
Qt::ControlModifier | Ctrl键 |
Qt::AltModifier | Alt键 |
Qt::ShiftModifier | shift键 |
注意:QWitget::setEnable(bool) 可以禁用键盘和鼠标事件
常见的键盘事件为:
- keyPressEvent(QKeyEvent *event); //键盘按下事件
- keyReleaseEvent(QKeyEvent *event); //键盘松开事件
- void Widget::keyPressEvent(QKeyEvent *event)//键盘按下事件
- {
- if(event->key()==Qt::Key_Return)//判断是否是回车键
- {
- qDebug()<<tr("按下了回车键");
- }
- }
两个键
- void Widget::keyPressEvent(QKeyEvent *event)//键盘按下事件
- {
- if(event->modifiers()==Qt::ControlModifier)//判断第一个是否为Ctrl键
- {
- if(event->key()==Qt::Key_A)//判断是否为A
- {
- qDebug()<<tr("Crtl+A");
- }
- }
-
- }
三个键
- void Widget::keyPressEvent(QKeyEvent *event)//键盘按下事件
- {
- if(event->modifiers()==(Qt::ControlModifier|Qt::ShiftModifier))
- {
-
- if(event->key()==Qt::Key_A)//判断是否为A
- {
- qDebug()<<tr("Ctrl+Shift+A");
- }
- }
-
- }
isAutoRepeat() 返回如果此事件来自自动重复键;返回如果它来自初始按键
- void Widget::keyPressEvent(QKeyEvent *event)//键盘按下事件
- {
- if(event->isAutoRepeat())
- {
- qDebug()<<event->key();
- }
- else
- {
- qDebug()<<"非长按";
- }
- }
当长按时会输出按键编号,非常按时会输出"非长按"
添加一个成员变量:
bool A_key;//记录A的状态
- void Widget::keyPressEvent(QKeyEvent *event)//键盘按下事件
- {
- if(event->key()==Qt::Key_A)
- {
- if(event->isAutoRepeat()) return;//如果按键重复不做处理
- A_key=true;//标记A已经按下
- }
- else if(event->key()==Qt::Key_M)
- {
- if(A_key)
- {
- qDebug()<<tr("A+M");
- }
- }
- }
- void Widget::keyReleaseEvent(QKeyEvent *event)//键盘松开事件
- {
- if(event->key()==Qt::Key_A)//如果A按键松开的话
- {
- A_key=false;//标记A已经松开
- }
- }
以下内容参考以下文章:
Qt事件系统之三:键盘事件 - fengMisaka - 博客园 (cnblogs.com)
- QWidget::keyboardGrabber() 捕获键盘输入的部件
- QWidget::releaseKeyboard() 释放捕获的键盘输入
- grabKeyboard() 捕获键盘,此小部件接收所有键盘事件,直到调用releaseKeyboard();其他小部件根本没有键盘事件。
mybutton.h文件
- #ifndef MYBUTTON_H
- #define MYBUTTON_H
-
- #include
- #include
- #include
- class myButton : public QPushButton
- {
- Q_OBJECT
- public:
- explicit myButton(QWidget *parent = nullptr);
- protected:
- void keyPressEvent(QKeyEvent *event);//键盘按下事件
-
- signals:
-
- };
-
- #endif // MYBUTTON_H
mybutton.cpp文件
- #include "mybutton.h"
-
- myButton::myButton(QWidget *parent) : QPushButton(parent)
- {
-
- }
- void myButton::keyPressEvent(QKeyEvent * event)//鼠标按下事件
- {
- qDebug()<<objectName();//事件名称
- QWidget *widget=keyboardGrabber();//捕获键盘输入
- qDebug() << "正在捕获的控件:" << widget;
- if(event->key()==Qt::Key_Return)//当键盘输入回车时,释放捕获
- {
- releaseKeyboard();//释放捕获内容
- }
- }
在widget.h中添加两个成员变量:
- myButton *butt1=nullptr;
- myButton *butt2=nullptr;
widget构造函数添加内容:
- butt1=new myButton(this);
- butt1->setText("按键1");
- butt2=new myButton(this);
- butt2->setText("按键2");
- butt2->move(0,100);
- butt1->grabKeyboard();//捕获键盘
运行:页面为
键盘输入非回车内容时:
当键盘输入回车,再输入其他内容时:
利用计时器来判断是否是单机还是双击
在widget.h文件中添加
- void keyPressEvent(QKeyEvent *event);//按键弹起事件
- QTimer *timer=nullptr;//计时器
- int number=0;//统计点击次数
构造函数中添加:
- timer=new QTimer(this);
- connect(timer,&QTimer::timeout,[=]()
- {
- //计数器过了设定时间后执行
- number=0;
- timer->stop();//停止计时器
- qDebug()<<"单击";//当时间间隔超过200毫秒时,说明为单击
- });
事件的实现:
- void Widget::keyPressEvent(QKeyEvent *event)//按键弹起事件
- {
- if(event->key()==Qt::Key_Return)//弹起的键是回车键
- {
- if(!timer->isActive())//当计时器不在执行时
- {
- timer->start(200);//开启定时器200毫秒为判定标准
- }
- number++;//点击数+1
- if(number==2)
- {
- qDebug()<<"双击";
- number=0;//数据归零
- timer->stop();//停止计时器
- }
-
- }
- }
按键长按是使用
isAutoRepeat() 返回如果此事件来自自动重复键;返回如果它来自初始按键
- 如果长按的话就返回true
- 不是长按返回false
- void Widget::keyReleaseEvent(QKeyEvent *event)//键盘弹起事件
- {
- if(event->key()==Qt::Key_Return)
- {
- if(!event->isAutoRepeat())
- {
- qDebug()<<"非长按";
- }
- else
- {
- qDebug()<<"长按";
- }
- }
- }