Динамически изменять пользовательский URL-адрес хоста плагина osm на карте QML - PullRequest
1 голос
/ 18 января 2020

У меня есть собственный хост диаграмм с несколькими плиточными картами в структуре каталогов:

http://host/New_York/
http://host/Washington/
http://host/Montreal/

В приложении QML есть компонент ComboBox, который позволяет пользователю выбирать, какую диаграмму он хочет отобразить.

Компонент Map использует плагин osm с параметром PluginParameter, указывающим URL-адрес для использования в диаграмме. Я думал, что мог бы просто динамически назначить значение этому PluginParameter, но это не работает, значение остается неизменным даже после его назначения. Я также попытался уничтожить объект Plugin, воссоздать его и назначить его объекту Map, но я получаю сообщение об ошибке, в котором говорится, что свойство plugin равно ReadOnly.

Как правильно динамически изменять пользовательский URL-адрес хоста объекта Plugin, используемого компонентом Map?

    Plugin {
        id: mapPlugin
        name: "osm"

        PluginParameter { id: charturl; name: "osm.mapping.custom.host"; }
    }

    Map {
        id: mapview
        plugin: mapPlugin
        activeMapType: supportedMapTypes[supportedMapTypes.length - 1]
...

    ComboBox {
...
        onCurrentIndexChanged: {
            charturl.value = cbItems.get(currentIndex).url
...

1 Ответ

2 голосов
/ 19 января 2020

Плагин может быть написан только один раз, поэтому вы не можете изменить его позже, поэтому в этом случае вам нужно будет создать новую карту с помощью Loader:

main.qml

import QtQuick 2.14
import QtQuick.Window 2.14
import QtQuick.Layouts 1.14
import QtQuick.Controls 2.14

import QtLocation 5.14
import QtPositioning 5.14

Window {
    visible: true
    width: 640
    height: 480
    ColumnLayout {
        anchors.fill: parent
        ComboBox {
            id: combobox
            model: [
                "http://host/New_York/",
                "http://host/Washington/",
                "http://host/Montreal/"
            ]
            Layout.fillWidth: true
            onActivated: changeHost()
        }
        Loader{
            id: loader
            Layout.fillWidth: true
            Layout.fillHeight: true
            onStatusChanged: if (loader.status === Loader.Ready) console.log('Loaded')
        }
        Component.onCompleted: changeHost()
    }
    function changeHost(){
        var item = loader.item
        var zoomLevel = item ? item.zoomLevel: 14
        var center = item ? item.center: QtPositioning.coordinate(59.91, 10.75)

        loader.setSource("MapComponent.qml", {
                             "host": combobox.currentValue,
                             "center": center,
                             "zoomLevel": zoomLevel}
                         )
    }
}

MapComponent.qml

import QtLocation 5.14

Map {
    id: map
    property string host: ""
    plugin: Plugin {
        name: "osm"
        PluginParameter {
            name: "osm.mapping.custom.host"
            value: map.host
        }
    }
    activeMapType: supportedMapTypes[supportedMapTypes.length - 1]
}
...