3

我想使用按住行为来切换 gui 项的状态。

我使用FocusScope(下)接收键盘事件。

FocusScope{
    id:pageFocus

    property var pedalKey//a key id

    Keys.enabled: true
    Keys.onPressed: {
        if(event.key===pedalKey && !event.isAutoRepeat)
        {
            state="a"
        }
    }
    Keys.onReleased: {
        if(event.key===pedalKey && !event.isAutoRepeat)
        {
            state="b"
        }
    }
}

它有效,但是当FocusScope失去焦点时。
最可怕的是,我不知道哪个Item得到了焦点。
有什么方法可以让Item接收键盘事件没有焦点?

4

2 回答 2

3

您可以将关键事件转发给其他对象(甚至是多个对象)。 是 Qt 文档中的示例:

Item {
    ListView {
        id: list1
        // ...
    }
    ListView {
        id: list2
        // ...
    }
    Keys.forwardTo: [list1, list2]
    focus: true
}
于 2017-01-16T20:59:57.623 回答
2

它可以工作,但是当 FocusScope 失去焦点时。

是的,关键事件仅传递给具有 activeFocus 的项目。事件将首先发送到最里面的项目,沿着父链向上进行,直到其中一个接受事件(例如使用您在此处使用的处理程序)。

最可怕的是不知道哪个Item得到了焦点。

您可以使用Window.activeFocusItem附加属性查看当前焦点所在的位置。

有什么方法可以让 Item 在没有焦点的情况下接收键盘事件?

不容易或直接。您可以使用事件过滤在事件到达窗口之前拦截它们,但我认为这绝对是最后的选择。Shortcuts是另一种可能性,具体取决于您要拦截的压力。

于 2017-01-16T15:30:55.890 回答