QML MouseArea:如何将鼠标事件传播到其他鼠标区域?

问题描述 投票:0回答:1

我有一个复杂的对话框,其中包含许多布局复杂的控件。我需要添加一个光标标记:在此对话框上方绘制的垂直线,应跟随鼠标光标。我不知道该如何执行。简化的示例代码:

import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12

Window {
    visible: true
    width: 640
    height: 480

    Button {
        anchors.centerIn: parent
        width: 100
        height: 50
        text: "Button"
        highlighted:  hovered
    }

    Rectangle {
        id: cursorMarker
        width: 1
        color: "black"
        anchors.top: parent.top
        anchors.bottom: parent.bottom
    }

    MouseArea {
        anchors.fill: parent
        hoverEnabled: true

        onPositionChanged: {
            cursorMarker.x = mouse.x
        }

    }
}

在此示例中,MouseArea放置在按钮上方,并拦截所有鼠标消息。因此,当鼠标光标移到按钮上方时,该按钮不会突出显示。如果将MouseArea放置在按钮下方,则当鼠标移到按钮上方时,光标标记未正确定位。但我同时需要:光标标记正确地位于整个对话框上方,并且按钮正常工作。如何解决这个问题?

qt qml qtquick2
1个回答
0
投票
import QtQuick 2.12
import QtQuick.Window 2.12
import QtQuick.Controls 2.12

Window {
visible: true
width: 640
height: 480

property int mousePosX : 0
property int mousePosY : 0

Button {
    anchors.centerIn: parent
    width: 100
    height: 50
    text: "Button"
    // Test if the mouse is within the Button
    highlighted:  mousePosX > x && mousePosX > y && mousePosX < x + width && mousePosY < y + height
}

Rectangle {
    id: cursorMarker
    x: mousePosX
    width: 1
    color: "black"
    anchors.top: parent.top
    anchors.bottom: parent.bottom
}

MouseArea {
    id: mouse
    anchors.fill: parent
    hoverEnabled: true

    onPositionChanged: {
        mousePosX = mouse.x
        mousePosY = mouse.y
    }
}
}

我建议以下内容(不完全是您要问的问题,而是另一种实现此问题的方法::

  1. 将鼠标pos存储在某些变量中。
  2. 然后检查当前鼠标pos是否在按钮对象内(通过查看它是否位于该按钮的边界框中)
© www.soinside.com 2019 - 2024. All rights reserved.