QML:如何从 C++ 代码正确地将 属性 传递给 PluginParameter 值?
QML: How to correctly pass property to PluginParameter value from C++ code?
大家好!
我在将 属性 值从 C++
传递到 QML
时遇到了问题。我的项目是桌面应用程序,必须使用 Windows
下的地图。因此,在阅读文档后,我通过 QML
使用 Qt Location. I chose 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/"
- 一切正常,目录会补充新的缓存块。
可能是什么问题?
感谢提前!
如果有人感兴趣你可以解决这样的问题:
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 <...> }
<...>
}
大家好!
我在将 属性 值从 C++
传递到 QML
时遇到了问题。我的项目是桌面应用程序,必须使用 Windows
下的地图。因此,在阅读文档后,我通过 QML
使用 Qt Location. I chose 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/"
- 一切正常,目录会补充新的缓存块。
可能是什么问题?
感谢提前!
如果有人感兴趣你可以解决这样的问题:
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 <...> }
<...>
}