• 键盘的事件


     QKeyEvent(键盘事件) 

    头文件:#include

    构造函数为: 

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

    常用函数:

    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);  //键盘松开事件

     键盘事件的用法:

    一:按下单个键:

    1. void Widget::keyPressEvent(QKeyEvent *event)//键盘按下事件
    2. {
    3. if(event->key()==Qt::Key_Return)//判断是否是回车键
    4. {
    5. qDebug()<<tr("按下了回车键");
    6. }
    7. }

    二.按下组合键:

    两个键

    1. void Widget::keyPressEvent(QKeyEvent *event)//键盘按下事件
    2. {
    3. if(event->modifiers()==Qt::ControlModifier)//判断第一个是否为Ctrl键
    4. {
    5. if(event->key()==Qt::Key_A)//判断是否为A
    6. {
    7. qDebug()<<tr("Crtl+A");
    8. }
    9. }
    10. }

    三个键 

    1. void Widget::keyPressEvent(QKeyEvent *event)//键盘按下事件
    2. {
    3. if(event->modifiers()==(Qt::ControlModifier|Qt::ShiftModifier))
    4. {
    5. if(event->key()==Qt::Key_A)//判断是否为A
    6. {
    7. qDebug()<<tr("Ctrl+Shift+A");
    8. }
    9. }
    10. }

    三:自定义组合键 

    isAutoRepeat()   返回如果此事件来自自动重复键;返回如果它来自初始按键
    1. void Widget::keyPressEvent(QKeyEvent *event)//键盘按下事件
    2. {
    3. if(event->isAutoRepeat())
    4. {
    5. qDebug()<<event->key();
    6. }
    7. else
    8. {
    9. qDebug()<<"非长按";
    10. }
    11. }

     当长按时会输出按键编号,非常按时会输出"非长按"

     

    实现A+M键的组合

     

    添加一个成员变量:

        bool A_key;//记录A的状态
    
    1. void Widget::keyPressEvent(QKeyEvent *event)//键盘按下事件
    2. {
    3. if(event->key()==Qt::Key_A)
    4. {
    5. if(event->isAutoRepeat()) return;//如果按键重复不做处理
    6. A_key=true;//标记A已经按下
    7. }
    8. else if(event->key()==Qt::Key_M)
    9. {
    10. if(A_key)
    11. {
    12. qDebug()<<tr("A+M");
    13. }
    14. }
    15. }
    16. void Widget::keyReleaseEvent(QKeyEvent *event)//键盘松开事件
    17. {
    18. if(event->key()==Qt::Key_A)//如果A按键松开的话
    19. {
    20. A_key=false;//标记A已经松开
    21. }
    22. }

    以下内容参考以下文章:

    Qt事件系统之三:键盘事件 - fengMisaka - 博客园 (cnblogs.com)

     

    四:键盘捕获 

    • QWidget::keyboardGrabber()   捕获键盘输入的部件
    • QWidget::releaseKeyboard()    释放捕获的键盘输入
    • grabKeyboard() 捕获键盘,此小部件接收所有键盘事件,直到调用releaseKeyboard();其他小部件根本没有键盘事件。

    创建一个按钮,继承于QPushButton

    mybutton.h文件

    1. #ifndef MYBUTTON_H
    2. #define MYBUTTON_H
    3. #include
    4. #include
    5. #include
    6. class myButton : public QPushButton
    7. {
    8. Q_OBJECT
    9. public:
    10. explicit myButton(QWidget *parent = nullptr);
    11. protected:
    12. void keyPressEvent(QKeyEvent *event);//键盘按下事件
    13. signals:
    14. };
    15. #endif // MYBUTTON_H

     mybutton.cpp文件

    1. #include "mybutton.h"
    2. myButton::myButton(QWidget *parent) : QPushButton(parent)
    3. {
    4. }
    5. void myButton::keyPressEvent(QKeyEvent * event)//鼠标按下事件
    6. {
    7. qDebug()<<objectName();//事件名称
    8. QWidget *widget=keyboardGrabber();//捕获键盘输入
    9. qDebug() << "正在捕获的控件:" << widget;
    10. if(event->key()==Qt::Key_Return)//当键盘输入回车时,释放捕获
    11. {
    12. releaseKeyboard();//释放捕获内容
    13. }
    14. }

    在widget.h中添加两个成员变量:

    1. myButton *butt1=nullptr;
    2. myButton *butt2=nullptr;

     widget构造函数添加内容:

    1. butt1=new myButton(this);
    2. butt1->setText("按键1");
    3. butt2=new myButton(this);
    4. butt2->setText("按键2");
    5. butt2->move(0,100);
    6. butt1->grabKeyboard();//捕获键盘

    运行:页面为

     键盘输入非回车内容时:

    当键盘输入回车,再输入其他内容时: 

     

    五:键盘点击(单击和多击)

    利用计时器来判断是否是单机还是双击

    在widget.h文件中添加

    1. void keyPressEvent(QKeyEvent *event);//按键弹起事件
    2. QTimer *timer=nullptr;//计时器
    3. int number=0;//统计点击次数

    构造函数中添加:

    1. timer=new QTimer(this);
    2. connect(timer,&QTimer::timeout,[=]()
    3. {
    4. //计数器过了设定时间后执行
    5. number=0;
    6. timer->stop();//停止计时器
    7. qDebug()<<"单击";//当时间间隔超过200毫秒时,说明为单击
    8. });

    事件的实现:

    1. void Widget::keyPressEvent(QKeyEvent *event)//按键弹起事件
    2. {
    3. if(event->key()==Qt::Key_Return)//弹起的键是回车键
    4. {
    5. if(!timer->isActive())//当计时器不在执行时
    6. {
    7. timer->start(200);//开启定时器200毫秒为判定标准
    8. }
    9. number++;//点击数+1
    10. if(number==2)
    11. {
    12. qDebug()<<"双击";
    13. number=0;//数据归零
    14. timer->stop();//停止计时器
    15. }
    16. }
    17. }

    六:按键长按

    按键长按是使用

    isAutoRepeat()   返回如果此事件来自自动重复键;返回如果它来自初始按键

    • 如果长按的话就返回true
    • 不是长按返回false
    1. void Widget::keyReleaseEvent(QKeyEvent *event)//键盘弹起事件
    2. {
    3. if(event->key()==Qt::Key_Return)
    4. {
    5. if(!event->isAutoRepeat())
    6. {
    7. qDebug()<<"非长按";
    8. }
    9. else
    10. {
    11. qDebug()<<"长按";
    12. }
    13. }
    14. }

  • 相关阅读:
    【C#语音文字互转】.NET的TTS文本转语音合成
    Integer对象和int值
    2022 年杭电多校第十场补题记录
    volatile关键字_java培训
    智慧公厕是将数据、技术、业务深度融合的公共厕所敏捷化“操作系统”
    做app的测试,你大概率会用到这个命令,尤其是做monkey测试
    [MRCTF2020]套娃
    好用的电容笔有哪些?2022年电容笔十大品牌排行榜
    [机缘参悟-30]:鬼谷子-内揵篇-同理心,站在对方的立场,拉近与对方的心理距离
    由注意力机制中scaled sqrt(dk)操作联想到期望与方差的本质推导
  • 原文地址:https://blog.csdn.net/qq_45303986/article/details/127817943