【问题标题】:How to propagate a MouseEvent such as onEntered/onExited?如何传播诸如 onEntered/onExited 之类的 MouseEvent?
【发布时间】:2015-11-16 12:56:32
【问题描述】:

根据Qt documentation on MouseArea,只有“组合”事件(例如单击)可以传播到 z 顺序较低的项目。

如何为简单的鼠标事件(例如 onEntered 或 onExited)复制相同的行为?

例如我有两个矩形,都有一个 MouseArea,上面的矩形覆盖了下面矩形的右下角。如果我单击任一矩形上的任意位置,包括重叠区域,两个矩形的 MouseAreas 都将收到onClicked 信号,因为我已使用propagateComposedEvents: true 并在upperRect 的处理程序中设置mouse.accepted = false。但是onEntered 仅适用于 lowerRect 的非重叠部分。

Rectangle {
    id: lowerRect
    x: 0
    y: 0
    width: 100
    height: 100
    color: "blue"

    MouseArea {
        anchors.fill: parent
        onClicked: console.log("lowerRect was clicked")
        hoverEnabled: true
        onEntered: console.log("lowerRect was entered")
    }
}

Rectangle {
    id: upperRect
    x: 50
    y: 50
    width: 50
    height: 50
    color: "green"
    opacity: 0.8

    MouseArea {
        anchors.fill: parent
        propagateComposedEvents: true
        onClicked: {
            mouse.accepted = false
            console.log("upperRect was clicked")
        }
        hoverEnabled: true
        onEntered: console.log("upperRect was entered")
    }
}

【问题讨论】:

  • 我知道这不是您正在寻找的,但您可以依靠信号。无论如何有点棘手,但你可以让它工作。

标签: qml


【解决方案1】:

您可以手动调用信号。类似myMouseArea.entered()myMouseArea.exited()(其中myMouseAreaid 或对MouseArea 对象的引用)将起作用。

【讨论】:

  • 您能详细说明一下吗?我是 Qt 的新手,刚刚掌握了信号和插槽的窍门。你是说我会在 lowerRect 的 MouseArea 上创建插槽并从 upperRect 的 MouseArea 生成信号吗?或者你有什么更优雅的想法,可以在有 100 个矩形的地方工作?
  • 是的,这就是我对这个问题的解决方案。如果你想处理 100 个 Rectangles,你可以在 JavaScript Array 中存储对它们的引用,并使用 for 循环传播信号。如果您想了解更多信息,请具体说明,我将编辑我的答案。
  • 谢谢,我明白了。我在我的问题中混淆了两件事。我问你如何传播信号,你已经回答了,所以我勾选了你的答案。但是,我想检测鼠标何时进入下矩形,即使鼠标已经在上矩形内(即当上矩形没有收到 onEntered 时)。我已经在我的问题中编辑了示例,以免混淆这两个问题......我在这里问了另一个问题:stackoverflow.com/questions/33776373/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-14
  • 1970-01-01
  • 2018-08-15
  • 1970-01-01
  • 1970-01-01
  • 2012-09-11
相关资源
最近更新 更多