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

Posted

技术标签:

【中文标题】如何在未聚焦的 QtQuick 项目中接收键盘事件?【英文标题】:How to receive keyboard events in an unfocused QtQuick Item? 【发布时间】:2017-01-16 10:22:02 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

确实,如果有一组“已知”的项目将获得焦点,这是一个很好的建议!【参考方案2】:

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

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

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

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

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

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

【讨论】:

以上是关于如何在未聚焦的 QtQuick 项目中接收键盘事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使选定的行在未聚焦的数据网格中突出显示?

对于 TextField 小部件中的长文本,如何在未聚焦后从头开始显示文本?

处理 EditText 未聚焦状态时的物理键盘按键事件

Xamarin / iOS - 如何从硬件键盘禁用选项卡键码

键盘聚焦性 和点击性

QtQuick:如何覆盖窗口关闭事件?