QML: Как правильно передать свойство в значение PluginParameter из кода C++?

Здравствуйте все!

У меня проблема с передачей значения свойства через C++ в QML, Мой проект - настольное приложение, которое должно работать с картами под Windows, Итак, после прочтения документов я нашел лучшее решение с помощью QML используя Qt Location. Я выбрал OSM Plugin.

Все работает хорошо, но мне нужно вручную найти кеш в пользовательский каталог. Так что для этого я хочу передать такое свойство (cachePath) значение от C++ код для QML,

Часть кода C++:

QQuickView *view = new QQuickView;
view->rootContext()->setContextProperty("cachePath", "C:/111/");
view->setSource(QUrl(QStringLiteral("qrc:/qml/OSMView.qml")));

Важная часть кода QML:

Map
{
    zoomLevel: 10

    plugin: Plugin
    {
        name: "osm"
        PluginParameter { name: "osm.mapping.highdpi_tiles"; value: true }
        PluginParameter { name: "osm.mapping.offline.directory"; value: cachePath }
        PluginParameter { name: "osm.mapping.cache.directory"; value: cachePath }
    }

    <... nevermind ...>
}

Так что отладка говорит, что все в порядке и собственность передана. Но нет новых плиток после работы с картами в этом пользовательском каталоге.

Но если я наберу вручную value: "C:/111/" - все работает нормально и каталог пополняется новыми тайлами кеша.

В чем может быть проблема?

Спасибо за продвижение!

1 ответ

Решение

Если кто-то интересен, вы можете решить проблему следующим образом:

Сторона C++:

QVariantMap params
{
    {"osm.mapping.highdpi_tiles", YOUR_CUSTOM_VALUE},
    {"osm.mapping.offline.directory", YOUR_CUSTOM_VALUE},
    {"osm.mapping.cache.directory", YOUR_CUSTOM_VALUE}
};

QQuickView *view = new QQuickView;
view->setSource(QUrl(QStringLiteral("qrc:/qml/OSMView.qml")));
QObject *item = (QObject *) view->rootObject();
QMetaObject::invokeMethod(item, "initializePlugin", Q_ARG(QVariant, QVariant::fromValue(params)));

Сторона QML:

Item
{
    id: osmMain    
    property variant parameters

    function initializePlugin(pluginParameters)
    {
        var parameters = new Array;
        for(var prop in pluginParameters)
        {
            var parameter = Qt.createQmlObject('import QtLocation 5.6; PluginParameter{ name: "'+ prop + '"; value: "' + pluginParameters[prop] + '"}', map)
            parameters.push(parameter)
        }
        osmMain.parameters = parameters
        map.plugin = Qt.createQmlObject('import QtLocation 5.6; Plugin{ name: "osm"; parameters: osmMain.parameters }', osmMain)
    }

    Map { id: map <...> }

<...>

}
Другие вопросы по тегам