如何在未聚焦的QtQuick项目中接收键盘事件?

时间:2017-01-16 10:22:03

标签: qt qml qtquick2 qt-quick qtquickcontrols2

我想使用按住行为来切换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无焦点地接收键盘事件?

2 个答案:

答案 0 :(得分:2)

  

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

是的,关键事件仅传递给具有activeFocus的项目。该事件将首先发送到最内层项目,然后继续向父母链接,直到其中一个接受事件(例如使用您在此处使用的处理程序)。

  

最可怕的是我不知道哪个项目得到了关注。

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

  

有没有办法让Item能够在没有焦点的情况下接收键盘事件?

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

答案 1 :(得分:2)

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

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