如何在未聚焦的 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在没有焦点的情况下接收键盘事件?
不容易或直接。您可以使用事件过滤在事件到达窗口之前拦截它们,但我认为这绝对是最后的选择。 Shortcut
s 是另一种可能性,具体取决于您要拦截的压力机。
【讨论】:
以上是关于如何在未聚焦的 QtQuick 项目中接收键盘事件?的主要内容,如果未能解决你的问题,请参考以下文章
对于 TextField 小部件中的长文本,如何在未聚焦后从头开始显示文本?