原创文章,欢迎转载。转载请注明:转载自 祥的博客
原文链接:https://blog.youkuaiyun.com/humanking7/article/details/80700233
1.原理
重写GUI类中的按键事件响应函数在响应函数中进行处理。
要包含头文件#include <QKeyEvent>
1.1效果
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码值
。总结如下图所示: