Распространение событий onPositionChanged на фоновые элементы в QtQuick 1.1

Background.qml

import QtQuick 1.1

Item {
    MouseArea {
        id: backgroundMouseArea
        anchors.fill: parent
        hoverEnabled: true

        onPositionChanged: {
            console.log("Background")
        }
    }
}

Foreground.qml

import QtQuick 1.1

Item {
    Background {
        width: 1920
        height: 1080
    }

    MouseArea {
        anchors.fill: parent
        hoverEnabled: true

        onPositionChanged: {
            console.log("Foreground")
            [mouse.accepted = false] - Not working (as the docs say)
            [backgroundMouseArea.onPositionChanged(mouse)] - Not working
        }
    }
}

Мне нужно выполнить событие onPositionChanged как для фона, так и для элементов переднего плана.

F.ex. для onPressed я бы сделал это, установив mouse.accepted = false в элементе переднего плана.

Могу ли я вызвать onPositionChanged фонового элемента вручную? Если да, то как мне это сделать?


person Dorin Botan    schedule 10.03.2017    source источник


Ответы (1)


Я не совсем уверен, чего вы пытаетесь достичь здесь. MouseArea предназначен для захвата событий мыши с аппаратного обеспечения. Если вы действительно хотите распространять события мыши в фоновом режиме из другого MouseArea, возможно, вы действительно хотите дать Background простое property mousePosition вместо MouseArea, а затем установить эту позицию из обработчика переднего плана onPositionChanged.

Кроме того, ваш код переднего плана зависит от внутреннего параметра id внутри фона. Это очень плохо пахнет. Часто полезнее думать об «общедоступном API» «классов» фона и переднего плана. Если то, что я описал выше, действительно то, что вы хотите сделать, вот как это должно выглядеть ИМХО:

// Background.qml
import QtQuick 1.1
Rectangle {
    // an object with just x and y properties
    // or the complete mouseevent, whatever you want
    // Use variant for QtQuick 1/Qt4, var for QtQuick 2.0 / Qt5
    property variant mousePosition
    onMousePositionChanged: console.log(
      "Background " + mousePosition.x + " " + mousePosition.y
    )
}

//Foreground.qml
import QtQuick 1.1
Item {
  // use only ids defined in the same file
  // else, someone might change it and not know you use it
  Background { id: background }
  MouseArea {
    anchors.fill: parent
    hoverEnabled: true

    onPositionChanged: {
       console.log("Foreground")
       background.mousePosition = {x: mouse.x, y: mouse.y}
    }
  }
}

...........

person at-2500    schedule 10.03.2017