[Interest] How to dynamically add a MapItemView to a Map?

Paolo Angelelli paolo.angelelli at qt.io
Tue Sep 6 17:55:18 CEST 2016


On Tue, 6 Sep 2016 19:04:34 +0530
Kishore J <kitts.mailinglists at gmail.com> wrote:

> Hi
> 
> I am inching forward with using QML maps in my C++ application. Now
> i'm interested in dynamically adding multiple MapItemView objects to
> a given map.
> 
> 
> import QtQuick 2.5
> import QtLocation 5.6
> 
> Map {
>     id: map
>     objectName: "MyMap"
> //     zoomLevel: (maximumZoomLevel - minimumZoomLevel)/2
>     zoomLevel: minimumZoomLevel
> 
>     plugin: Plugin {
>         name: "here"
>         PluginParameter {name: "here.app_id"; value: "xxxxx"}
>         PluginParameter {name: "here.token"; value: "xxxxx"}
>     }
> //     activeMapType: supportedMapTypes[3]
>     center {
>         latitude: 10
>         longitude: 20
>     }
> 
>     MapCircle {
>         id: staticCircle
>         center {
>             latitude: 5
>             longitude: 10
>         }
>         radius: 500000.0
>         color: 'yellow'
>         border.width: 4
>         border.color: 'yellow'
>         Component.onCompleted: {
>             console.debug("Loaded static MapCircle")
>             console.debug(center + ' radius: ' + radius)
>         }
>         Component.onDestruction: {
>             console.debug("Unloaded static MapCircle")
>         }
>     }
> 
>     MapItemView {
>         id: mapitemview
>         objectName: "MyMapItemView"
>         model: ListModel {
>             id: list
>             ListElement{lat: 10; lon: 20; rad: 800000}
>             ListElement{lat: 30; lon: 40; rad: 700000}
>         }
>         delegate: Component {
>             id: delegate
> 
>             MapCircle {
>                 id: dynmapcircle
>                 center {
>                     latitude: lat;
>                     longitude: lon;
>                 }
>                 radius: 500000.0
>                 color: 'black'
>                 border.width: 4
>                 border.color: 'black'
>                 Component.onCompleted: {
>                     console.count("Loaded a MapCircle")
>                     map.addMapItem(dynmapcircle)
>                 }
>             }
>         }
> 
>         Component.onCompleted: {
>             console.debug("Loaded first MapItemView")
>             console.debug(model.count)
>         }
>         Component.onDestruction: {
>             console.debug("Unloaded first MapItemView")
>         }
>     }
> 
>     MapItemView {
>         id: mapitemview2
>         objectName: "MyMapItemView2"
>         model: ListModel {
>             id: list2
>             ListElement{lat: -10; lon: 20; rad: 800000}
>             ListElement{lat: -30; lon: 40; rad: 700000}
>         }
>         delegate: Component {
>             id: delegate2
> 
>             MapCircle {
>                 id: dynmapcircle2
>                 center {
>                     latitude: lat;
>                     longitude: lon;
>                 }
>                 radius: 500000.0
>                 color: 'blue'
>                 border.width: 4
>                 border.color: 'blue'
>                 Component.onCompleted: {
>                     console.count("Loaded a MapCircle2")
>                     map.addMapItem(dynmapcircle2)
>                 }
>             }
>         }
> 
>         Component.onCompleted: {
>             console.debug("Loaded second MapItemView")
>         }
>         Component.onDestruction: {
>             console.debug("Unloaded second MapItemView")
>         }
>     }
> 
>     Component.onCompleted:{
>         center.latitude = 10
>         center.longitude = 20
>         console.debug('Loaded map ' + map.center)
>     }
>     Component.onDestruction:{
>         console.debug('Unloaded map')
>     }
> }
> 
> Further, i do not understand why i have to call the map.addMapItem()
> function for each MapItem. I suspect that, that is the source of my
> problem. I am currently able to define a separate qml file containing
> the second MapItemView which i instantiate in C++ and set the map as
> it's parent but that does not work.
> 
> Any help would be appreciated.
> --
> Regards,
> Kishore
> 
> PS: I also seem to be facing another issue where the center value
> specified in the map initialization does not work and I have to set
> the center in the onCompleted() slot. Funnily, it only considers the
> Latitude or Longitude value in the initialization depending on which
> is first specified!

Hi, for the first question, the answer is "you can't".
This is a limitation of the current API, and something that might be
worthwile extending.
So feel free to send a feature request to jira.

For the second question, please have a look if the (now merged) patch
fixes your bug

best,
Paolo



More information about the Interest mailing list