Как я могу динамически нарисовать многоугольник и сделать его точки / маркеры подвижными в QML?

Я столкнулся с проблемой, когда мне нужно динамически нарисовать многоугольник на карте QML с помощью мыши и сделать его точки подвижными, чтобы пользователь мог изменить расположение этих точек. Есть очень хороший ответ на подобный вопрос, который помог мне по крайней мере динамически добавлять некоторые точки / маркеры и соединять их через линии, но это не позволяет маркерам быть подвижными.

Может кто-нибудь, пожалуйста, помогите мне в этом отношении?

Всего 1 ответ


В следующем коде маркер будет добавлен правой кнопкой мыши, и вы можете перетащить маркер правой кнопкой мыши.

Логика добавления проста - обнаружить правый щелчок мыши и получить с этой информацией позицию, добавив ее в модель, связанную с MapItemView, который обрабатывает маркеры и точки MapPolygon.

С другой стороны, логику перетаскивания сначала нужно обнаружить без нажатия маркера, так что область мыши, присоединенная к каждому маркеру, используется для получения индекса этого элемента, отключая «жест» карты. MouseArea маркеров было настроено таким образом, чтобы они продолжали распространять события мыши на другие элементы, поскольку обнаружение освобождения должно выполняться на карте, для этого используются сигналы positionChanged и Released, с которыми определяется положение маркера. обновлять и восстанавливать переменные при необходимости.

import QtQuick 2.14
import QtQuick.Window 2.14
import QtLocation 5.14
import QtPositioning 5.14

Window {
    visible: true
    width: 640
    height: 480
    property int currentIndex: -1
    ListModel{
        id: polygonmodel
    }
    Map {
        id: map
        anchors.fill: parent
        plugin: Plugin {
            name: "osm"
        }
        gesture.enabled: currentIndex == -1
        center: QtPositioning.coordinate(59.91, 10.75) // Oslo
        zoomLevel: 14
        MapItemView{
            z: polygon.z + 1
            model: polygonmodel
            delegate: MapQuickItem{
                anchorPoint: Qt.point(sourceItem.width/2, sourceItem.height/2)
                coordinate: QtPositioning.coordinate(model.coords.latitude, model.coords.longitude)
                sourceItem: Image {
                    width: 40
                    height: 40
                    source: "http://maps.gstatic.com/mapfiles/ridefinder-images/mm_20_red.png"
                    MouseArea{
                        anchors.fill: parent
                        acceptedButtons: Qt.LeftButton
                        propagateComposedEvents: true
                        onPressed: {
                            currentIndex = index
                            mouse.accepted = false
                        }
                    }
                }
            }
        }
        MapPolygon{
            id: polygon
            border.color: "green"
            border.width: 10
        }
        MouseArea{
            anchors.fill: parent
            acceptedButtons: Qt.LeftButton | Qt.RightButton
            onClicked: {
                var point = Qt.point(mouse.x, mouse.y)
                var coord = map.toCoordinate(point);
                if (mouse.button == Qt.RightButton)
                    addMarker(coord)
            }
            onPositionChanged: {
                if (currentIndex != -1){
                    var point = Qt.point(mouse.x, mouse.y)
                    var coord = map.toCoordinate(point);
                    if(coord.isValid)
                        moveMarker(currentIndex, coord)
                }
            }
            onReleased: {
                if (mouse.button == Qt.LeftButton && currentIndex != -1){
                    var point = Qt.point(mouse.x, mouse.y)
                    var coord = map.toCoordinate(point);
                    if(coord.isValid)
                        moveMarker(currentIndex, coord)
                    currentIndex = -1;
                }
            }
        }
    }
    function moveMarker(index, coordinate){
        polygonmodel.set(index, {"coords": coordinate})
        var path = polygon.path;
        path[index] = coordinate
        polygon.path = path
    }
    function addMarker(coordinate){
        polygonmodel.append({"coords": coordinate})
        polygon.addCoordinate(coordinate)
    }
}

Есть идеи?

10000