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

我有一个安装了事件过滤器的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事件来自哪里?

编辑:

事实证明,当QDialog被打开时,QMainwindow会失去焦点,并且当QDialog关闭时永远不会获得焦点。 我在QMainwindow的eventFilter中使用了setFocus(),并且它似乎有效。


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

至于ShortcutOverride事件,他们来为每个按键,因为任何键或组合键可以注册为一个快捷方式。 如果需要,此事件可让您选择取消快捷方式处理。 它必须尽早处理,当引擎不知道按下的键是否将用作快捷键时。 因此,所有按键都会产生事件“以防万一”。 你可以在这里阅读更多:https://wiki.qt.io/ShortcutOverride


这是发生在一个孩子的重要新闻时。 它用于重写快捷键处理(QKeyEvent)。

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

链接地址: http://www.djcxy.com/p/39267.html

上一篇: Why does QEvent::ShortcutOverride event occur?

下一篇: How to block mouse inputs on dialog box in MFC