为什么会发生 QEvent::ShortcutOverride 事件



我有一个安装了事件过滤器的QMainWindow。打开和关闭 QDialog 后,键盘箭头键没有响应,因为 QMainWindow 只接收快捷方式覆盖事件而不是按键事件。

当我更改 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;
}

为什么会这样?这些快捷方式覆盖事件从何而来?

编辑:

事实证明,QMainwindow在QDialog打开时失去焦点,而在QDialog关闭时永远不会恢复焦点。我在QMainwindow的事件过滤器中使用了setFocus(),它似乎可以解决问题。

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

至于ShortcutOverride事件,它们适用于每次按键,因为任何键或键组合都可以注册为快捷方式。如果需要,此事件为您提供了取消快捷方式处理的选项。当引擎还不知道按下的键是否会用作快捷方式时,必须在尽可能早的时刻处理它。因此,为所有按键生成事件"以防万一"。你可以在这里阅读更多: https://wiki.qt.io/ShortcutOverride

当在孩子中按键时,就会发生这种情况。它用于覆盖快捷键处理(QKeyEvent)。

请参阅 http://qt-project.org/doc/qt-4.8/qevent.html#Type-enum

相关内容

  • 没有找到相关文章

最新更新