QML键盘快捷键与按键OnPressed事件冲突

3

我有一个关于QML程序的问题。在最高级别的main.qml文件中,我有一些键盘快捷方式,如下所示:

Shortcut {
  sequence: "Up"
  onActivated: {
    // yadda yadda
  }
}

在另一个文件中,我有几个像这样的Keys.onPressed调用:
Keys.onPressed: {
  if (event.key == Qt.Key_Up) {
    // yadda yadda
  }
}

显然,快捷键干扰了OnPressed调用。当我注释掉快捷键时,OnPressed正常工作。但是当它们都激活时,似乎快捷键拦截了键盘按下事件并阻止了OnPressed的激活。
我知道对于鼠标事件,Qt有一个"accepted"变量。如果你想让事件继续向下传递,你只需在OnActivated函数中设置"accepted = false"即可实现。然而,在快捷键API中,我没有看到任何等效的“accepted”变量。有没有其他方法可以确保事件正确地传播?
1个回答

2
为了像一个快捷方式一样工作,Shortcut 必须比当前焦点项中的键处理程序具有更高的优先级。否则,它就与普通的键处理程序没有什么区别。然而,有时需要覆盖快捷方式,就像你所做的那样。
在 Qt 5.8 及更早版本中,您可以禁用 Shortcut,以防止在某些条件下处理快捷事件。例如:
Shortcut {
    enabled: !someItem.activeFocus
}

在Qt 5.9中,引入了更好的机制来处理此问题。具有按键处理程序的活动焦点项现在可以通过接受使用Keys.shortcutOverride的快捷方式覆盖事件来覆盖快捷方式。例如:
Item {
    focus: true
    Keys.onShortcutOverride: {
        if (event.key == Qt.Key_Up)
            event.accepted = true
    }
    Keys.onUpPressed: ...
}

谢谢!我正在使用Qt 5.7。我能够巧妙地设置/取消启用变量以实现我的目标。 - user1765354

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接