在Qt 常常会使用到组合按键作为快捷键,而快捷键往往有一下的写法:
void QMainWindow::keyReleaseEvent(QKeyEvent *event)
{
int uKey = event->key();
Qt::KeyboardModifiers modifiers = event->modifiers();
//判断某个修饰键是否被按下
if (modifiers == Qt::NoModifier)
{
// 判断ukey是哪个键
}
else if (modifiers == Qt::ControlModifier)
{
// 判断ukey是哪个键
}
else if (modifiers == Qt::ShiftModifier)
{
// 判断ukey是哪个键
}
else if(modifiers =( Qt::ShiftModifier | Qt::ControlModifier))
{
}
.... // 这里省略无数代码
}
然后,自信满满的提交代码,结果有部分按键死活都不触发!!!,有些按钮能触发,却在小键盘上无法触发
// Qt 并没有把windows底层的按键处理
// 需要注意
1、
if(modifiers == Qt::ShiftModifier) //时候,部分键位有其他意义,例如
{
if(nkey == Qt::Key_1 || nkey == Qt::Key_3)
{
// 这种写法是错误的 shift + 1 = ! ->>> Qt::Key_Exclam
// shif + 3 = # ->>> Qt::Key_NumberSign
}
}
其次上面的错误还有:字母上面的数字键,和小键盘的数字键在shift模式下,表示不同的键
2、
if (modifiers == Qt::NoModifier) // 需要注意的是,shift+小键盘会进这里
{
// 这里需要判断小键盘的情况
if(nKey == Qt::Key_End) // 这里有两种触发形式直接按end键、或者shift+小键盘1--小键盘也可能不响应
{
}
}
3、
if (modifiers == Qt::ControlModifier) // 这么写也不一定对,ctrl+A 和ctrl+方向键是不一致的
{
// 判断ukey是哪个键
}
// 应该写成
if(modifiers == Qt::ControlModifier || modifiers & Qt::ControlModifier)
{
// 再判断按键
}
// 注意,需要优先处理多个按键情况类似 Qt::ControlModifier + Qt::ShiftModifier + Qt::AltModifier