1

我有一个 StackView,里面有两个项目。这两个项目都应该处理一些键。

我会假设,如果currentItemStackView 中的 不处理密钥,那么密钥将被转发到较低层,但显然情况并非如此。

下面的例子说明了这个问题。当按下例如“A”时,我看到该键layer1由堆栈视图本身处理,但该键不由layer0.

请注意,layer0由于在layer1properties.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
            }
        }
    }
}
4

1 回答 1

2

我会假设,如果 StackView 中的 currentItem 不处理密钥,那么密钥将被转发到较低层,但显然情况并非如此。

显然根据Qt 文档,关键事件传播是这样的:

如果具有活动焦点的 QQuickItem 接受键事件,则传播停止。否则,事件将被发送到项目的父项,直到事件被接受或到达根项目。

如果我理解正确,在您的示例中,这两个项目是兄弟姐妹。Layer1 具有焦点,它将在层次结构中向上传播事件,而不是水平或向下传播。而且,那些倍数focus: true不会有任何影响,因为最后一个接收焦点的项目会得到它,在这种情况下layer1中Component.onCompleted

解决此问题的一种方法可能是定义一个新信号,例如,

Window {
    id: mainWindow
    ...
    signal keyReceived(int key)

然后在 StackView 中触发 Keys.onPressed 上的该事件:

    Keys.onPressed: {
        console.log("StackView.onPressed")
        keyReceived(event.key)
    }

最后在你的矩形中捕捉到新信号:

Component {
    id: layer1
    Rectangle {
        Connections {
            target: mainWindow
            onKeyReceived: console.log("layer1")
        }
    }
}
于 2016-09-20T16:54:42.947 回答