QKeyEvent(键盘事件)
头文件:#include<QKeyEvent>
构造函数为:
但一般不会手动去创建键盘对象
常用函数:
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()<<"非长按";
}
}
当长按时会输出按键编号,非常按时会输出"非长按"
实现A+M键的组合
添加一个成员变量:
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();其他小部件根本没有键盘事件。
创建一个按钮,继承于QPushButton
mybutton.h文件
#ifndef MYBUTTON_H
#define MYBUTTON_H
#include <QPushButton>
#include<QKeyEvent>
#include<QDebug>
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()<<"长按";
}
}
}