QML键盘快捷键干扰Key OnPressed事件

时间:2017-04-26 21:23:52

标签: qt events qml keyboard-shortcuts qtquick2

我的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 = false"在OnActivated函数中,以实现此目的。但是,我没有看到任何等同的"接受" Shortcuts API中的变量。是否有其他方法可以确保事件正确传播?

1 个答案:

答案 0 :(得分:2)

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

在Qt 5.8及更早版本中,您可以disable 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: ...
}