QML MouseArea: как распространять события мыши на другие области мыши? - PullRequest
0 голосов
/ 20 марта 2020

У меня сложный диалог, который содержит множество элементов управления в сложных макетах. Мне нужно добавить маркер курсора: вертикальная линия, которая рисуется над этим диалогом и должна следовать за курсором мыши. Я не понимаю, как это реализовать. Пример упрощенного кода:

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 находится под кнопкой, маркер курсора не позиционируется правильно, когда мышь перемещается над кнопкой. Но мне нужно и то и другое: маркер курсора правильно расположен над всем диалогом и кнопка работает правильно. Как решить эту проблему?

1 Ответ

0 голосов
/ 21 марта 2020
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. Затем проверьте, находится ли текущая позиция мыши внутри объектов кнопки (видя, находится ли она внутри ограничительного прямоугольника этой кнопки)
...