QML键怪异/错误行为 - 事件发送到错误的对象

时间:2015-08-19 17:32:01

标签: focus qml qt5 keyboard-events qtquick2

在处理QML键盘事件时,我遇到了一些奇怪的行为。在此示例中,可以创建对象树,通过选择树元素,加号和减号键应附加并删除所选分支的元素,空格键应扩展或收缩所选分支。

enter image description here

但它没有按预期工作。虽然加号和减号将对当前活动元素起作用,但空格键将始终扩展/收缩根元素,而不管当前选择哪个元素。奇怪的是,使用鼠标右键按预期正确处理元素,从而实现所需的行为。空格键和鼠标右键几乎使用相同的代码,但由于某种原因,使用空格键始终调用根节点的功能,而不是当前处于焦点的功能,这应该是接收键盘事件。

以下是代码的相关部分:

UI {
    id: ui
    expanded: true

    UIList {
        model: ui.proxy.model()
    }    

    Rectangle {
        width: 50
        height: 50
        color: ui.activeFocus ? "red" : "darkred"
        MouseArea {
            anchors.fill: parent
            acceptedButtons: Qt.LeftButton | Qt.RightButton
            onClicked: {
                if (mouse.button === Qt.LeftButton) ui.forceActiveFocus()
                else ui.expanded = !ui.expanded
            }
        }
    }

    Keys.onPressed: {
        switch (event.key) {
        case Qt.Key_Plus:
            ui.create()
            break
        case Qt.Key_Minus:
            ui.pop()
            break
        case Qt.Key_Space:
            ui.expanded = !ui.expanded
            break
        }
    }
}

1 个答案:

答案 0 :(得分:0)

事实证明forceActiveFocus()不仅关注特定元素,还关注层次结构的所有元素。事件在目标元素中接收,然后将其父级向下级联,直到根元素。

事件处理程序中的简单event.accepted = true足以阻止其在层次结构中传播。