在qml中将event.key从childs传递给parent

时间:2018-04-17 16:33:02

标签: qt qml

我将尝试用一个简单的例子说明我的问题。

我有一个看起来像这样的主窗口:

leftWindow

rightWindowWindowWindow { id: left width: 1280 height: 320 visible: true Rectangle{ anchors.fill: parent color: "black" focus: true Keys.onPressed: { if (event.key == Qt.Key_Left) { event.accepted = true; } } } } - 组件,它们看起来像:

key.event

我想在按下某个键时执行某些操作,无论此刻什么窗口被激活。 这意味着我应该以某种方式捕获所有event.accepted = true并将它们传递给我的两个窗口的父级。 该文档提到事件将自动向上传播给父项,直到执行{{1}},但我已经尝试过,并且没有任何内容真正传播到根元素。

如何做到这一点?

1 个答案:

答案 0 :(得分:0)

您可以在根项

中定义信号
Item {
    id:root
    signal activated(real value)
    onActivated: console.log("Singal emitted with value: " + value)
    LW { id: leftWindow }
    RW { id: rightWindow }
}

并在每个活动窗口中发出该信号

Window {
    id: left
    width: 1280
    height: 320
    visible: true
    Rectangle{
        anchors.fill: parent
        color: "black"
        focus: true
        Keys.onPressed: {
            if (event.key === Qt.Key_Left) {
                event.accepted = true;
                onPressed: root.activated(1)
            }
        }
    }
}

在将事件本身转发回根项目时,可以在主项目中实现Keys处理程序并从Window接收事件:

Item {
    id: root
    Keys.onPressed: {
        if (event.key === Qt.Key_Left){
            event.accepted = true;
            console.log(event.key)
        }
    }
    LW { id: leftWindow }
    RW { id: rightWindow }
    }

并在Window中:

Window {
...
//    Keys.forwardTo: [root]   // Just forward the event, OR action and forward:
        Keys.onPressed: {
            root.Keys.pressed(event)
        }
...
}

更新:基于相关的修改;

根据Keyboard Focus in Qt Quick, 事件的传播在QQuickItem层次结构中,在有效QQuickWindow内进行...直到QQuickItem接受关键事件

  
      
  1. 如果到达根项,则忽略键事件。
  2.   

传播发生在Item继承的属性链Difference in QML between Window and Item in parent-children relationship

这意味着QQuickWindow不会处理或传播该事件,也就像在此帖QML2 ApplicationWindow Keys handling

中一样

因此,作为顶级父级的Window将忽略该事件,而不会进一步传播到Item。解决方案是手动转发事件,完全Keys.forwardTo: [root]或行动和转发。