我有一个包含两个项目的StackView。这两个项目都应该处理一些密钥。
我认为,如果StackView中的currentItem
没有处理密钥,那么密钥将被转发到较低层,但显然情况并非如此。
以下示例说明了该问题。当按下'A'时,我看到密钥由layer1
和堆栈视图本身处理,但密钥不由layer0
处理。
请注意,由于layer0
layer1
声明导致properties.exitItem.visible = true
在transitionFinished
之上,import QtQuick 2.0
import QtQuick.Window 2.2
import QtQuick.Controls 1.4
Window {
id: mainWindow
visible: true
width: 1280
height: 720
color: "black"
Component {
id: layer0
Rectangle {
focus:true
width:200;height:200;color:"red"
Keys.onPressed: console.log("layer0")
}
}
Component {
id: layer1
Rectangle {
focus:true
width:200;height:200;color:"#8000FF00"
Keys.onPressed: console.log("layer1")
}
}
StackView {
id: stack
width: parent.width
height: parent.height
focus: true
Component.onCompleted: {
stack.push(layer0)
stack.push(layer1).focus=true
}
Keys.onPressed: {
console.log("StackView.onPressed")
}
delegate: StackViewDelegate {
function transitionFinished(properties)
{
properties.exitItem.visible = true
properties.exitItem.focus = true
}
}
}
}
仍然可见
open
答案 0 :(得分:2)
我认为,如果StackView中的currentItem不处理密钥,那么密钥将被转发到较低层,但显然情况并非如此。
显然根据Qt Documentation,关键事件传播如下:
如果具有主动焦点的QQuickItem接受键事件,则传播停止。否则,事件将被发送到项目的父项,直到接受事件或达到根项目。
如果我理解正确,在你的例子中,这两个项目是兄弟姐妹。 Layer1具有焦点,它将在层次结构中传播事件UP,而不是水平或向下传播。此外,那些多个focus: true
赢得了任何效果,因为接收焦点的最后一个项目会获得它,在这种情况下{1}}中的layer1
解决这个问题的一种方法是定义一个新信号,比如说,
Component.onCompleted
然后在StackView中触发Keys.onPressed上的那个事件:
Window {
id: mainWindow
...
signal keyReceived(int key)
最后在你的矩形中捕捉新信号:
Keys.onPressed: {
console.log("StackView.onPressed")
keyReceived(event.key)
}