为什么会出现QEvent :: ShortcutOverride事件?

时间:2012-05-03 10:53:13

标签: c++ qt user-interface event-handling

我有一个安装了事件过滤器的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(),它似乎可以解决问题。

2 个答案:

答案 0 :(得分:2)

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

对于ShortcutOverride事件,它们适用于每个按键,因为任何键或键组合都可以注册为快捷键。如果需要,此事件为您提供取消快捷方式处理的选项。必须在发动机不知道按下的键是否将用作快捷方式的最早时刻进行处理。因此,为所有按键生成事件“以防万一”。您可以在此处阅读更多内容:https://wiki.qt.io/ShortcutOverride

答案 1 :(得分:0)

在儿童按键时发生这种情况。它用于覆盖快捷键处理(QKeyEvent)。

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