![](/img/trans.png)
[英]Why pressing of “Tab” key emits only QEvent::ShortcutOverride event?
[英]Why does QEvent::ShortcutOverride event occur?
我有一个安装了事件过滤器的QMainWindow。 打开和关闭QDialog后,键盘箭头键不响应,因为QMainWindow只接收ShortcutOverride事件而不是KeyPress事件。
当我更改QMainWindow的事件过滤器以处理ShortcutOverride事件时,我得到了一个奇怪的行为,因为在我的程序中每个按键事件之前都有两个快捷键覆盖事件(为什么??)。
这不起作用 - 事件被处理多次:
bool eventFilter(QObject *, QEvent *event) {
if(type == QEvent::KeyPress || type == QEvent::ShortcutOverride) {
QKeyEvent *keyEvent = static_cast<QKeyEvent *>(event);
switch(keyEvent->key()) {
case Qt::Key_Up:
case Qt::Key_Down:
case Qt::Key_Left:
case Qt::Key_Right:
// Do something here
break;
default:
break;
}
return true;
}
return false;
}
为什么会这样? 那些ShortcutOverride事件来自哪里?
事实证明,QDainwindow在QDialog打开时失去焦点,在QDialog关闭时永远无法获得它。 我在QMainwindow的eventFilter中使用了setFocus(),它似乎可以解决问题。
丢失焦点正是在对话框打开后没有获得任何键盘事件的原因。 您建议的解决方案可能是此问题的最佳解决方案。
对于ShortcutOverride事件,它们来自每个按键,因为任何键或键组合都可以注册为快捷键。 如果需要,此事件为您提供取消快捷方式处理的选项。 必须在发动机不知道按下的键是否将用作快捷方式的最早时刻进行处理。 因此,为所有按键生成事件“以防万一”。 您可以在这里阅读更多内容: https : //wiki.qt.io/ShortcutOverride
当孩子的按键被按下时就会发生这种情况。 它用于覆盖快捷键处理(QKeyEvent)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.