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

Kishore J kitts.mailinglists at gmail.com
Thu Sep 8 14:28:18 CEST 2016


Resending to the group instead...

On Thu, Sep 8, 2016 at 5:49 PM, Kishore J <kitts.mailinglists at gmail.com>
wrote:

> Surprising! Can you test if the following code works? You should see one
> yellow circle. But do you also see 2 black and 2 blue circles? I dont see
> them here unless i uncomment the addMapItem lines
>
> /*****************/
> import QtQuick 2.5
> import QtLocation 5.6
>
> Map {
>     id: map
>     objectName: "MyMap"
>     zoomLevel: minimumZoomLevel
>
>     plugin: Plugin {
>         name: "here"
>         PluginParameter {name: "here.app_id"; value: "xxxxx"}
>         PluginParameter {name: "here.token"; value: "xxxxx"}
>     }
>     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: 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: 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')
>     }
> }
> /*****************/
>
> If the above works for you, i shall file a bug.
> --
> Regards,
> Kishore
>
> On Thu, Sep 8, 2016 at 2:28 PM, Paolo Angelelli <paolo.angelelli at qt.io>
> wrote:
>
>> It is odd since i tried to correct your code and then it was working
>> form me.
>> But feel free to open a bugreport with some sample code that can be
>> built and run to demonstrate the problem :-)
>>
>> best,
>> Paolo
>>
>> On Thu, 8 Sep 2016 10:04:27 +0530
>> Kishore J <kitts.mailinglists at gmail.com> wrote:
>>
>> > Thanks! I understand how that can be an issue. However, I now removed
>> > the enclosing Component (Which really did not do anything). Still, if
>> > i do not call addMapItem() it does not show on the map.
>> > --
>> > Regards,
>> > Kishore
>> >
>> > On Wed, Sep 7, 2016 at 7:45 PM, Paolo Angelelli
>> > <paolo.angelelli at qt.io> wrote:
>> >
>> > > I see i forgot to answer one question, about delegates and
>> > > addMapItem.
>> > >
>> > > The problem in your case is that your delegate is incorrect.
>> > > The delegate of a MapItemView must be a Map Item subclass,
>> > > that means MapCircle MapRectangle MapPolygon etc.
>> > >
>> > > If you have it wrapped into a Component, when this component gets
>> > > addMapItem'd to the map, it will be also skipped.
>> > >
>> > > try removing the Component wrapper, and you'll see it works.
>> > > (and by the way in your example you miss a window, so the example
>> > > doesn't work as is)
>> > >
>> > > best,
>> > > Paolo
>> > >
>> > > On Tue, 6 Sep 2016 22:53:31 +0530
>> > > Kishore J <kitts.mailinglists at gmail.com> wrote:
>> > >
>> > > > Done. https://bugreports.qt.io/browse/QTBUG-55782
>> > > >
>> > > > Given the limitation, I think my immediate alternative is to
>> > > > create a MapItemView like component that is instantiated outside
>> > > > and write code in the map that calls addMapItem and removeMapItem
>> > > > on the map as and when the list is modified. To the drawing
>> > > > board...
>> > > >
>> > > > Is the patch for the bug requiring to call addMapItem for each
>> > > > item in the MapItemView delegate is due for the next release?
>> > > > i.e. 5.8?
>> > > >
>> > > > How about the bug relating to the setting the center of the map?
>> > > > Its easy to work around but I want to know if it's me doing
>> > > > something wrong. --
>> > > > Regards,
>> > > > Kishore
>> > > >
>> > > > On Tue, Sep 6, 2016 at 9:25 PM, Paolo Angelelli
>> > > > <paolo.angelelli at qt.io> wrote:
>> > > >
>> > > > > 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
>> > > > > _______________________________________________
>> > > > > Interest mailing list
>> > > > > Interest at qt-project.org
>> > > > > http://lists.qt-project.org/mailman/listinfo/interest
>> > > > >
>> > >
>> > > _______________________________________________
>> > > Interest mailing list
>> > > Interest at qt-project.org
>> > > http://lists.qt-project.org/mailman/listinfo/interest
>> > >
>>
>> _______________________________________________
>> Interest mailing list
>> Interest at qt-project.org
>> http://lists.qt-project.org/mailman/listinfo/interest
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20160908/d1789cb5/attachment.html>


More information about the Interest mailing list