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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/humanking7/article/details/80700233


原创文章,欢迎转载。转载请注明:转载自 祥的博客

原文链接:https://blog.csdn.net/humanking7/article/details/80700233



1.原理

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

要包含头文件#include <QKeyEvent>

1.1效果

IMG20180615000000.gif

2.代码

2.1.按键响应代码

在头文件中声明

protected: //keyboard
    void keyPressEvent(QKeyEvent *event);
    void keyReleaseEvent(QKeyEvent *event);

在源文件中实现

// 键盘按下事件
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_***的值转换为有意义的字符。


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中。

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码值。总结如下图所示:

IMG20180615000001.png


赞赏码New

猜你喜欢

转载自blog.csdn.net/humanking7/article/details/80700233
今日推荐