2017-07-06 92 views
0

大家好!QML:如何從C++代碼正確傳遞屬性到PluginParameter值?

我有通過C++QML傳遞屬性值的問題。我的項目是桌面應用程序,必須與Windows下的地圖一起使用。所以,在閱讀文檔後,我通過QML使用Qt Location找到了最佳解決方案。我選擇了OSM Plugin

一切正常,但我需要手動定位緩存到自定義目錄。所以爲此,我想將C++代碼中的此類屬性(cachePath)值傳遞給QML。的C++代碼

部分:QML代碼

QQuickView *view = new QQuickView; 
view->rootContext()->setContextProperty("cachePath", "C:/111/"); 
view->setSource(QUrl(QStringLiteral("qrc:/qml/OSMView.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/" - 一切工作正常,目錄補充新的緩存切片。

可能是什麼問題?

感謝您的提前!

+0

你有任何錯誤/警告消息控制檯?如果我用C++改變插件參數運行類似的例子,我會得到以下消息:'QML Map:Plugin是一次寫入屬性,不能再次設置' – folibis

+0

@folibis,no我在控制檯中沒有這樣的消息。爲什麼我應該?我首先設置屬性,然後才加載QML。對於這個插件參數,它必須是第一個和最後一個值。 – someoneinthebox

+0

它似乎會在5.9.2中修復 –

回答

0

如果有人有興趣就可以解決這樣的問題:

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

<...> 

} 
0

你已經嘗試過這樣的事情:

在C++

QObject *objYourObject; 
objYourObject = rootObject->findChild<QObject *>("pluginName"); 
objYourObject->setProperty("cachePath", "C:/111/"); 

在您的QML文件:

Rectangle { 
    objectName: "pluginName" 

    property string cachePath: "" 

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

對我來說,它的工作原理和我使用它,每當我需要它。

我希望它有幫助。

+0

我不能這樣做,因爲@folibis說:'QML地圖:插件是一次寫入屬性,不能再次設置。 – someoneinthebox