如何在未获得焦点的 QtQuick Item 中接收键盘事件?

How to receive keyboard events in an unfocused QtQuick Item?

我想使用按住行为来切换 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在没有焦点的情况下接收键盘事件?

It works, but when FocusScope lost the focus.

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

The most terrible thing is that I don't know which Item got the focus.

您可以使用 Window.activeFocusItem attached property 查看当前焦点所在的位置。

Is there any way to enable the Item to receive keyboard events without focus?

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

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

Item {
    ListView {
        id: list1
        // ...
    }
    ListView {
        id: list2
        // ...
    }
    Keys.forwardTo: [list1, list2]
    focus: true
}