为啥会发生 QEvent::ShortcutOverride 事件?

Posted

技术标签:

【中文标题】为啥会发生 QEvent::ShortcutOverride 事件?【英文标题】:Why does QEvent::ShortcutOverride event occur?为什么会发生 QEvent::ShortcutOverride 事件? 【发布时间】:2012-05-03 10:53:13 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

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

以上是关于为啥会发生 QEvent::ShortcutOverride 事件?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 MergeSort 函数会发生值限制?

为啥会发生这种双释放错误?

为啥会发生 QEvent::ShortcutOverride 事件?

不明白为啥会发生 UnboundLocalError(关闭)[重复]

不明白为啥会发生 UnboundLocalError(关闭)[重复]

为啥开关(Java)会发生这种情况? [复制]