通过Enter和键盘事件转发的QML MenuItem触发器不起作用

时间:2018-03-22 19:00:25

标签: qt qml

这里我有一个最小的例子:

import QtQuick 2.9
import QtQuick.Controls 2.3
import QtQuick.Window 2.2


Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Component.onCompleted: {
        menu.open();
    }

    Menu {
        id: menu

        Keys.onPressed: {
            console.log("pressed")
        }

        MenuItem {
            text: "test"
            Keys.forwardTo: [menu]
            focus: highlighted
            onTriggered: {
                console.log("triggered 1")
            }
        }
        MenuItem {
            text: "test2"
            focus: highlighted
            Keys.forwardTo: [menu]
            onTriggered: {
                console.log("triggered 2")
            }
        }
        MenuItem {
            text: "test3"
            focus: highlighted
            Keys.forwardTo: [menu]
            onTriggered: {
                console.log("triggered 3")
            }
        }

    }

}

使用键盘浏览菜单项按预期方式工作。但是使用Enter键触发不起作用。另外,作为一种解决方法,我尝试将关键事件转发到父菜单项,但它也不起作用。

我现在看到解决它的唯一方法:将Keys.onReturnPressed放在每个MenuItem上并调用triggered()信号。但感觉不对。

这是Qt的错误吗? 什么是正确的解决方法呢?

我正在使用Qt 5.10.1

1 个答案:

答案 0 :(得分:2)

Menu不是Item,因此无法设置为Keys.forwardTo。 默认情况下启用Menu通过Forward/Backward键的导航,Keys.forwardTo不是必需的。

为什么输入密钥不起作用,因为选择MenuItem使用Space密钥而非Enter密钥。 [↑][↓]适用于Navigation(focus)[Space]适用于Selection

我想如果你想听取[Enter]的{​​{1}}密钥,添加Selection是正确的方法。

<强>更新

Keys.onReturnPressed: triggered();密钥在Qt 5.6(已验证)中工作。检查source代码。但看起来它在当前版本中被删除了。