1

大家好!

我遇到了将属性值传递给的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/"- 一切正常,并且目录会补充新的缓存切片。

可能是什么问题呢?

感谢提前!

4

1 回答 1

2

如果有人有趣,您可以解决这样的问题:

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 <...> }

<...>

}
于 2017-07-14T12:17:15.750 回答