键盘的事件

 QKeyEvent(键盘事件) 

头文件:#include<QKeyEvent>

构造函数为: 

但一般不会手动去创建键盘对象

常用函数:

count()返回事件涉及的按键格式
key()返回按下的键的代码
matches()判断是否与标准键匹配
modifiers()返回事件发生后立即存在的键盘修饰符标志(用于判断组合键)
isAutoRepeat()返回如果此事件来自自动重复键;返回如果它来自初始按键

key()常用的键:很多就不一 一列举了

Qt::Key_Return回车键
Qt::Key_Tabtable键
Qt::Key_EscapeEsc键
Qt::Key_Enter数字键盘上的回车
Qt::Key_Delete删除键
Qt::ControlModifierCtrl键
Qt::AltModifierAlt键
Qt::ShiftModifiershift键

 注意: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()<<"长按";
        }
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值