前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[QT]响应键盘事件(附虚拟键值转换函数)

[QT]响应键盘事件(附虚拟键值转换函数)

作者头像
祥知道
发布2020-03-10 15:40:43
3.1K0
发布2020-03-10 15:40:43
举报
文章被收录于专栏:祥的专栏祥的专栏
  1. 附录福利

1.原理

重写GUI类中的按键事件响应函数在响应函数中进行处理。

要包含头文件#include <QKeyEvent>

1.1效果

2.代码

2.1.按键响应代码

在头文件中声明

代码语言:javascript
复制
protected: //keyboard
    void keyPressEvent(QKeyEvent *event);
    void keyReleaseEvent(QKeyEvent *event);

在源文件中实现

代码语言:javascript
复制
// 键盘按下事件
void check_keyboard_mouse::keyPressEvent(QKeyEvent *event)
{
    qDebug() << "=== press key";
    int keyValue = event->key();
    if (keyValue == Qt::Key_Control)
    {//当按下Ctrl键,获取鼠标在屏幕中的绝对位置
        QPoint pt = QCursor::pos();
        QString str;
        str = QString("%1 , %2").arg(pt.x()).arg(pt.y());   
        ui.edit_m_absolute->setText(str);
    }

    //响应父类默认的按键事件 - 这里我进行了屏蔽
    //比如:按下Esc就会退出软件
    //QDialog::keyPressEvent(event);
}

/*
    键盘的:
    [Tab    Home End Del ← → BackSpace]
    这7个键
    只能触发keyReleaseEvent()函数
    而keyPressEvent()函数触发不了
*/

// 按键释放事件
void check_keyboard_mouse::keyReleaseEvent(QKeyEvent *event)
{
    qDebug() << "    release key ===";
    QString str_QTkey;
    str_QTkey = getKeyValue(event);
    if (event->isAutoRepeat()) return;  
}

2.2.注意按键响应函数中的几个特殊情况

键盘上的这7个键

  • Tab
  • Home
  • End
  • Del
  • 方向键左
  • 方向键右
  • BackSpace

只能触发keyReleaseEvent()函数,而keyPressEvent()函数触发不了。还有打印屏幕的PrtSc键都无法响应。不知道为什么会出现这种情况,经过测试进行验证得到【猜测:这几个键与文本操作比较相关,用ReleaseEvent效率更高?求大佬解答】

2.3.功能性代码

Qt::Key_***的值转换为有意义的字符。

代码语言:javascript
复制
QString check_keyboard_mouse::getKeyValue(QKeyEvent* event)
{
    int keyValue;//数值表示意义
    QString keyValue_Hex;//16进制
    QString keyValue_QT_KEY;//表示意义

    keyValue = event->key();    
    keyValue_Hex = QString("0x%1").arg(keyValue, 2, 16, QLatin1Char('0'));//k为int型或char型都可
    //键盘上大部分键值对应的都是其表示的ASCII码值
    //这些特定的值见附录的福利图
    keyValue_QT_KEY = QString(keyValue);


    //对于特殊意义的键值[event->key()的值无法用ASCII码展示]
    switch (keyValue)
    {
    case Qt::Key_Escape:
        keyValue_QT_KEY = QString("Esc");
        break;

    case Qt::Key_Tab:
        keyValue_QT_KEY = QString("Tab");
        break;

    case Qt::Key_CapsLock:
        keyValue_QT_KEY = QString("CapsLock");
        break;
    case Qt::Key_Shift:
        keyValue_QT_KEY = QString("Shift");
        break;
    case Qt::Key_Control:
        keyValue_QT_KEY = QString("Ctrl");
        break;
    case Qt::Key_Alt:
        keyValue_QT_KEY = QString("Alt");
        break;
    case Qt::Key_Backspace:
        keyValue_QT_KEY = QString("Backspace"); 
        break;
    case Qt::Key_Meta:
        keyValue_QT_KEY = QString("Win"); 
            break;
    case Qt::Key_Return:
        keyValue_QT_KEY = QString("Enter(main)");
        break;
    case Qt::Key_Enter:
        keyValue_QT_KEY = QString("Enter(num)");
        break;
    case Qt::Key_Home:
        keyValue_QT_KEY = QString("Home");
        break;
    case Qt::Key_End:
        keyValue_QT_KEY = QString("End");
        break;
    case Qt::Key_PageUp:
        keyValue_QT_KEY = QString("PageUp");
        break;
    case Qt::Key_PageDown:
        keyValue_QT_KEY = QString("PageDown");
        break;
    case Qt::Key_Insert:
        keyValue_QT_KEY = QString("Insert");
        break;
    case Qt::Key_Up:
        keyValue_QT_KEY = QString::fromLocal8Bit("↑");
        break;
    case Qt::Key_Right:
        keyValue_QT_KEY = QString::fromLocal8Bit("→");
        break;
    case Qt::Key_Left:
        keyValue_QT_KEY = QString::fromLocal8Bit("←");
        break;
    case Qt::Key_Down:
        keyValue_QT_KEY = QString::fromLocal8Bit("↓");
        break;
    case Qt::Key_Delete:
        keyValue_QT_KEY = QString("Del");
        break;
    case Qt::Key_Space:
        keyValue_QT_KEY = QString("Space");
        break;
    case Qt::Key_F1:
        keyValue_QT_KEY = QString("F1");
        break;
    case Qt::Key_F2:
        keyValue_QT_KEY = QString("F2");
        break;
    case Qt::Key_F3:
        keyValue_QT_KEY = QString("F3");
        break;
    case Qt::Key_F4:
        keyValue_QT_KEY = QString("F4");
        break;
    case Qt::Key_F5:
        keyValue_QT_KEY = QString("F5");
        break;
    case Qt::Key_F6:
        keyValue_QT_KEY = QString("F6");
        break;
    case Qt::Key_F7:
        keyValue_QT_KEY = QString("F7");
        break;
    case Qt::Key_F8:
        keyValue_QT_KEY = QString("F8");
        break;
    case Qt::Key_F9:
        keyValue_QT_KEY = QString("F9");
        break;
    case Qt::Key_F10:
        keyValue_QT_KEY = QString("F10");
        break;
    case Qt::Key_F11:
        keyValue_QT_KEY = QString("F11");
        break;
    case Qt::Key_F12:
        keyValue_QT_KEY = QString("F12");
        break;
    case Qt::Key_NumLock:
        keyValue_QT_KEY = QString("NumLock");
        break;
    case Qt::Key_ScrollLock:
        keyValue_QT_KEY = QString("ScrollLock");
        break;
    case Qt::Key_Pause:
        keyValue_QT_KEY = QString("Pause");
        break;
    }

    //在UI中显示
    setKayUI(keyValue, keyValue_Hex, keyValue_QT_KEY);



    return keyValue_QT_KEY;

}

显示到界面LineEdit中。

代码语言:javascript
复制
void check_keyboard_mouse::setKayUI(int keyValue, QString keyValue_hex, QString keyValue_QtKey)
{
    ui.edit_keyValue->setText( QString("%1").arg(keyValue) );
    ui.edit_keyValue_Hex->setText(keyValue_hex);
    ui.edit_keyValue_QtKey->setText(keyValue_QtKey);
}

3. 附录福利

对于QT的虚拟按键,其中一部分键值Qt::Key_***的值对应的就是其表示字符的ASCII码值。总结如下图所示:

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.原理
    • 1.1效果
    • 2.代码
      • 2.1.按键响应代码
        • 2.2.注意按键响应函数中的几个特殊情况
          • 2.3.功能性代码
          • 3. 附录福利
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档