C++ 为什么会发生QEvent::ShortcutOverride事件?

C++ 为什么会发生QEvent::ShortcutOverride事件?,c++,qt,user-interface,event-handling,C++,Qt,User Interface,Event Handling,我有一个安装了事件过滤器的QMainWindow。 打开和关闭QDialog后,键盘箭头键不响应,因为QMainWindow只接收ShortcutOverride事件,而不接收KeyPress事件 当我更改QMainWindow的事件过滤器以处理ShortcutOverride事件时,我得到了一个奇怪的行为,因为在我的程序中,每个按键事件前面都有两个快捷方式覆盖事件(为什么??) 这不起作用-事件被处理多次: bool eventFilter(QObject *, QEvent *event)

我有一个安装了事件过滤器的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;
}
bool事件过滤器(QObject*,QEvent*事件){
if(type==QEvent::KeyPress | | type==QEvent::ShortcutOverride){
QKeyEvent*keyEvent=静态广播(事件);
开关(keyEvent->key()){
案例Qt::键向上:
案例Qt::按键向下:
案例Qt::左键:
案例Qt::键右:
//在这里做点什么
打破
违约:
打破
}
返回true;
}
返回false;
}
为什么会这样?那些短途超车事件是从哪里来的

编辑: 事实证明,QDialog打开时,QMainwindow会失去焦点,而QDialog关闭时,QMainwindow将永远无法恢复焦点。
我在QMainwindow的eventFilter中使用了setFocus(),它似乎起到了作用。

这是在按下子项时发生的。它用于覆盖快捷键处理(QKeyEvent)


“参考”

失去焦点正是对话框打开后无法获取任何键盘事件的原因。您建议的解决方案可能是解决此问题的最佳解决方案

至于ShortcutOverride事件,每次按键都会出现,因为任何键或键的组合都可以注册为快捷方式。如果需要,此事件提供取消快捷方式处理的选项。当发动机还不知道按下的键是否将被用作快捷方式时,必须在尽可能早的时间进行处理。因此,所有按键都会生成事件“以防万一”。您可以在此处阅读更多内容:

在我的例子中,子对象(QDialog)被销毁,但仍会触发快捷方式覆盖事件。