按下 MouseEvents 时获取 MouseEvents

Get MouseEvents while MousePressed

我有几个 QML 项目都有鼠标区域。

我要实现的是:

示例代码:

import QtQuick 2.3
import QtQuick.Window 2.2

Window {
    visible: true
    width:500; height: 200;
    Rectangle{
        anchors.left: parent.left
        color: 'red'
        width: 200; height: 200;

        MouseArea {
            anchors.fill: parent
            hoverEnabled: true
            onReleased: console.log('onReleased red')
            onEntered:  console.log('onEntered red')
            onPressed:  {
                console.log('onPressed red')
                mouse.accepted = false
            }
        }
    }
    Rectangle{
        anchors.right: parent.right
        color: 'blue'
        width: 200; height: 200;

        MouseArea {
            anchors.fill: parent
            hoverEnabled: true
            onReleased: console.log('onReleased blue')
            onEntered:  console.log('onEntered blue')
            onPressed:  console.log('onPressed blue')
        }
    }
}

预期行为:

示例代码有我试过的两个版本,接受和不接受 mousePressed 事件。

发生的事情是: 如果我在一个矩形上按下鼠标,我不会得到所有其他矩形的 onEnter 事件。 如果我不接受 onPressed 事件,我会得到 onEnter 事件而不是 onReleased 事件。

注:

我已经找到 this Answer 它使用 DropArea 作为解决方法,如果有任何其他解决方案,我不想使用它。

尽管示例可能看起来像拖放操作,但这不是我想要的。 请参阅此问题顶部的 "What I want to achieve"。

仅使用标准 MouseArea 组件将无法实现您想要的效果。标准 QML 组件的功能有点受限。 您要做的是通过 QML 扩展创建您自己的 MouseArea 组件。 在我们的项目中,我们也遇到了很多关于鼠标处理的问题,所以我们是如何做到的:

  1. Subclassed QQuickItem,在这个 class 内部,我们只是跟踪鼠标移动和鼠标按钮状态。一件重要的事情是安装由此 class.

  2. 定义的 EventFilters
  3. 在 QML 中,创建了一个检查鼠标是否在当前组件内部的简单组件。

如果您需要,我也可以 post 在此处提供代码,以便您了解。 实施不是最漂亮的,但它有效