QML добавляет новые элементы PathCurve в список <PathElements>в ShapePath - PullRequest
1 голос
/ 22 марта 2019

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

К сожалению, я не могу понять, как я могу добавить новые элементы PathCurve к существующему списку в объекте Shape :: ShapePath.

Я ожидал, что что-то вроде этого должно работать:

...

MapQuickItem {
    coordinate: QtPositioning.coordinate(0.0000, 0.0000)

    sourceItem: Shape {
    id: myShape
        anchors.fill: parent
        vendorExtensionsEnabled: false

        ShapePath {
            id: myPath
            strokeColor: "black"
            strokeWidth: 2
            capStyle: ShapePath.RoundCap
            fillColor: "transparent"

            startX: 0; startY: 0
        }
    }
    zoomLevel: 15
}

MouseArea {
    anchors.fill: parent

    onClicked: {
        var coord = parent.toCoordinate(Qt.point(mouse.x,mouse.y))

        myPath.pathElements.push( new PathCurve(mouse.x, mouse.y) ) //does not work
    }
}

Я также пытался заполнить PathElements из C ++, но класс PathCurve кажется закрытым и может использоваться только из QML. Hardcoding PathCurve Elements работает отлично, как и в каждом онлайн-примере, но я хочу динамически изменять список патчей.

Любая помощь будет принята с благодарностью!

1 Ответ

2 голосов
/ 22 марта 2019

Вы должны динамически компоненты, используя функцию createQmlObject, но для этого вы должны иметь в виду, что это зависит от zoomLevel, который вы применяете к MapQuickItem отношение размеров, так как это зависит от рисования, PathCurve не использует координатыокно, но координаты формы, и форма окрашивается в соответствии с тем, как она настроена.Так что в этом случае zoomLevel для MapQuickItem должен быть равен 0 или совпадать с картой.Учитывая вышеизложенное, решение выглядит так:

import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Shapes 1.12
import QtPositioning 5.9
import QtLocation 5.3

Window {
    id: root
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    Plugin {
        id: mapPlugin
        name: "osm" // "mapboxgl" "osm" "esri"
    }

    Map {
        id: map
        anchors.fill: parent
        plugin: mapPlugin
        zoomLevel: 14
        center:  QtPositioning.coordinate(59.91, 10.75) // Oslo

        MapQuickItem {
            id: map_item
            coordinate: QtPositioning.coordinate(59.91, 10.75)
            anchorPoint.x : 0
            anchorPoint.y : 0
            zoomLevel: map.zoomLevel
            sourceItem: Shape {
                id: myShape
                anchors.fill: parent
                vendorExtensionsEnabled: false
                ShapePath {
                    id: myPath
                    strokeColor: "black"
                    strokeWidth: 2
                    capStyle: ShapePath.RoundCap
                    fillColor: "transparent"
                    startX: 0; startY: 0
                }
            }
        }
    }
    MouseArea {
        id: mousearea
        anchors.fill: map
        onClicked: {
            var item_pos = map.fromCoordinate(map_item.coordinate, false)
            var pathcurve = Qt.createQmlObject('import QtQuick 2.12; PathCurve {}',
                                               myPath);
            pathcurve.x = mouse.x - item_pos.x
            pathcurve.y = mouse.y - item_pos.y
            myPath.pathElements.push(pathcurve)
        }
    }
}

enter image description here

...