我将尝试用一个简单的例子说明我的问题。
我有一个看起来像这样的主窗口:
leftWindow
rightWindow
和Window
是Window {
id: left
width: 1280
height: 320
visible: true
Rectangle{
anchors.fill: parent
color: "black"
focus: true
Keys.onPressed: {
if (event.key == Qt.Key_Left) {
event.accepted = true;
}
}
}
}
- 组件,它们看起来像:
key.event
我想在按下某个键时执行某些操作,无论此刻什么窗口被激活。
这意味着我应该以某种方式捕获所有event.accepted = true
并将它们传递给我的两个窗口的父级。
该文档提到事件将自动向上传播给父项,直到执行{{1}},但我已经尝试过,并且没有任何内容真正传播到根元素。
如何做到这一点?
答案 0 :(得分:0)
您可以在根项
中定义信号Item {
id:root
signal activated(real value)
onActivated: console.log("Singal emitted with value: " + value)
LW { id: leftWindow }
RW { id: rightWindow }
}
并在每个活动窗口中发出该信号
Window {
id: left
width: 1280
height: 320
visible: true
Rectangle{
anchors.fill: parent
color: "black"
focus: true
Keys.onPressed: {
if (event.key === Qt.Key_Left) {
event.accepted = true;
onPressed: root.activated(1)
}
}
}
}
在将事件本身转发回根项目时,可以在主项目中实现Keys处理程序并从Window接收事件:
Item {
id: root
Keys.onPressed: {
if (event.key === Qt.Key_Left){
event.accepted = true;
console.log(event.key)
}
}
LW { id: leftWindow }
RW { id: rightWindow }
}
并在Window中:
Window {
...
// Keys.forwardTo: [root] // Just forward the event, OR action and forward:
Keys.onPressed: {
root.Keys.pressed(event)
}
...
}
更新:基于相关的修改;
根据Keyboard Focus in Qt Quick,
事件的传播在QQuickItem
层次结构中,在有效QQuickWindow
内进行...直到QQuickItem
接受关键事件
- 如果到达根项,则忽略键事件。
醇>
传播发生在Item
继承的属性链Difference in QML between Window and Item in parent-children relationship
这意味着QQuickWindow
不会处理或传播该事件,也就像在此帖QML2 ApplicationWindow Keys handling
因此,作为顶级父级的Window
将忽略该事件,而不会进一步传播到Item
。解决方案是手动转发事件,完全Keys.forwardTo: [root]
或行动和转发。