Здравствуйте все!
У меня проблема с передачей значения свойства через C++
в QML
, Мой проект — настольное приложение, которое должно работать с картами под Windows
, Итак, после прочтения документов я нашел лучшее решение с помощью QML
с помощью Qt Location. Я выбрал Плагин OSM.
Все работает хорошо, но мне нужно вручную найти кеш в пользовательский каталог. Так что для этого я хочу передать такое свойство (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/"
— все работает нормально и каталог пополняется новыми тайлами кеша.
В чем может быть проблема?
Спасибо за продвижение!
Если кто-то интересен, вы можете решить проблему следующим образом:
Сторона 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 <...> }
<...>
}
Других решений пока нет …