Qt QML键盘快捷键干扰按键打开事件

Qt QML键盘快捷键干扰按键打开事件,qt,events,qml,keyboard-shortcuts,qtquick2,Qt,Events,Qml,Keyboard Shortcuts,Qtquick2,我的QML程序有问题。在顶级main.qml文件中,我有一些键盘快捷键,如下所示: Shortcut { sequence: "Up" onActivated: { // yadda yadda } } 在另一个文件中,我有几个按键。按此键调用: Keys.onPressed: { if (event.key == Qt.Key_Up) { // yadda yadda } } 显然,快捷键干扰了已按下的通话。当我注释出快捷方式时,OnPressed的工作

我的QML程序有问题。在顶级main.qml文件中,我有一些键盘快捷键,如下所示:

Shortcut {
  sequence: "Up"
  onActivated: {
    // yadda yadda
  }
}
在另一个文件中,我有几个按键。按此键调用:

Keys.onPressed: {
  if (event.key == Qt.Key_Up) {
    // yadda yadda
  }
}
显然,快捷键干扰了已按下的通话。当我注释出快捷方式时,OnPressed的工作正常。但当它们都处于活动状态时,快捷键似乎会拦截键盘按键,并阻止OnPressed激活


我知道,对于鼠标事件,Qt具有“accepted”变量。如果希望事件继续沿堆栈向下传播,可以在OnActivated函数中设置“accepted=false”来完成此操作。但是,我在快捷方式API中没有看到任何等效的“accepted”变量。是否有其他方法可以确保事件正确传播?

为了像快捷方式一样工作,
快捷方式必须比活动焦点项目中的键处理程序具有更高的优先级。否则,它与普通的密钥处理程序没有什么不同。但是,有时需要像您一样覆盖快捷方式

在Qt5.8及更早版本中,您可以创建一个
快捷方式
,以防止它在特定条件下处理快捷方式事件。例如:

Shortcut {
    enabled: !someItem.activeFocus
}
Item {
    focus: true
    Keys.onShortcutOverride: {
        if (event.key == Qt.Key_Up)
            event.accepted = true
    }
    Keys.onUpPressed: ...
}
在Qt5.9中,为此引入了一种更好的机制。带有键处理程序的活动焦点项现在可以通过使用接受快捷方式覆盖事件来覆盖快捷方式。例如:

Shortcut {
    enabled: !someItem.activeFocus
}
Item {
    focus: true
    Keys.onShortcutOverride: {
        if (event.key == Qt.Key_Up)
            event.accepted = true
    }
    Keys.onUpPressed: ...
}

谢谢我使用的是Qt5.7。为了实现我的目标,我能够巧妙地设置/取消设置启用的变量。