具有多个项目的StackView中的键处理

时间:2016-09-20 12:14:46

标签: qml qtquick2 qtquickcontrols stackview

我有一个包含两个项目的StackView。这两个项目都应该处理一些密钥。

我认为,如果StackView中的currentItem没有处理密钥,那么密钥将被转发到较低层,但显然情况并非如此。

以下示例说明了该问题。当按下'A'时,我看到密钥由layer1和堆栈视图本身处理,但密钥不由layer0处理。

请注意,由于layer0

中的layer1声明导致properties.exitItem.visible = truetransitionFinished之上,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

1 个答案:

答案 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)
    }