• qt5--键盘事件


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

  • 相关阅读:
    IIS/如何查看IIS上部署网站的实时连接数
    在文件系统中无法访问其他服务器共享的文件夹,如何解决
    SQL sever2008 r2 安装闪退的解决办法
    加密字符串传值时把+号过滤掉了的解决办法
    C# WinForm点击Radio判断是否选中,监控TextBox输入动作
    【转】Entity Framework 数据库初始化的三种方法
    Kubernetes RESTMapper源码分析
    Golang中下划线的使用
    测试开发该如何在团队中推广新工具、新技术(深度好文)
    Java 在Word指定段落/文本位置插入分页符 E
  • 原文地址:https://www.cnblogs.com/liming19680104/p/13729782.html
Copyright © 2020-2023  润新知