在处理QML键盘事件时,我遇到了一些奇怪的行为。在此示例中,可以创建对象树,通过选择树元素,加号和减号键应附加并删除所选分支的元素,空格键应扩展或收缩所选分支。
但它没有按预期工作。虽然加号和减号将对当前活动元素起作用,但空格键将始终扩展/收缩根元素,而不管当前选择哪个元素。奇怪的是,使用鼠标右键按预期正确处理元素,从而实现所需的行为。空格键和鼠标右键几乎使用相同的代码,但由于某种原因,使用空格键始终调用根节点的功能,而不是当前处于焦点的功能,这应该是接收键盘事件。
以下是代码的相关部分:
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
}
}
}
答案 0 :(得分:0)
事实证明forceActiveFocus()
不仅关注特定元素,还关注层次结构的所有元素。事件在目标元素中接收,然后将其父级向下级联,直到根元素。
事件处理程序中的简单event.accepted = true
足以阻止其在层次结构中传播。