2016-06-09 9:03 GMT+02:00 Gianluca <gmax...@gmail.com>:
> Did you try my solution ?

Ah, sorry for not replying earlier.

Well with a property alias to make the model available as "models",
the delegates would be dependent on this property alias being
available, they could not be reused in a context where it is not.

So the problem is really: It is hard to make a component that can be
dropped-in and used directly as a delegate, but also nested in a
delegate (Loader or Jason's approach) which provides the indirection
to handle items differently based on some criteria.

Elvis

>
> Il giorno 08/giu/2016, alle ore 15:13, Gian Maxera <gmax...@gmail.com> ha
> scritto:
>
>
> On 8 Jun 2016, at 14:32, Elvis Stansvik <elvst...@gmail.com> wrote:
>
> Hi all,
>
> I'm currently using a "type" role in my items and then a Loader as
> delegate, to give a level of indirection and let me choose the actual
> delegate based on the "type" of the item.
>
> This explains it better (from my ListView):
>
>        delegate: Loader {
>            sourceComponent: {
>                switch (type) {
>                case "color":
>                    return colorDelegate
>                case "flag":
>                    return flagDelegate
>                ...
>                }
>            }
>
>            Component {
>                id: colorDelegate
>
>                ColorDelegate { }
>            }
>
>            Component {
>                id: flagDelegate
>
>                FlagDelegate { }
>            }
>
>            ...
>        }
>
> What I don't like with this approach is that inside my delegates, e.g.
> ColorDelegate.qml, I have to use parent.ListView.view.model to get a
> reference to the model (needed for editing operations). The use of
> "parent" here assumes a certain layout, but I see no other way :(
>
> How have others solved the issue of delegates for heterogenous lists?
>
>
> I use the following approach:
>
> This is the ListView with the Loader inside:
>
> ListView {
>
> id: subsectionsList
>
> model: navList.model
>
> delegate: Loader {
>
> id: innerItem
>
> width: subsectionsList.width
>
> height: subsectionsList.height
>
> asynchronous: false
>
> property var models: sectionModel
>
> source: sectionPage
>
> }
>
> }
>
>
> Then, I create the model in the following way:
>
> ListModel {
>
> id: subsections
>
> // it's not possible to use the 'static' initialization:
>
> //    ListElement { ... }
>
> // because it does not support passing of object pointers
>
> Component.onCompleted: {
>
> append( {
>
> 'sectionName': "Hotel details",
>
> 'sectionPage':"HotelDetailsSubsection.qml",
>
> 'sectionModel': {
>
> 'event': event,
>
> 'hotel': hotel
>
> }
>
> })
>
> append( {
>
> 'sectionName': "Exhibitors",
>
> 'sectionPage':"HotelExhibitorsSubsection.qml",
>
> 'sectionModel': {
>
> 'event': event,
>
> 'hotel': hotel
>
> }
>
> })
>
> }
>
> }
>
>
> Pay attention on two key passages:
>  - the Loader inside the ListView has a property for keeping the models:
> “property var models: sectionModel
>  - the ListModel contain an attribute ‘sectionModel’ that it’s an object
> with the Items I want to inject and pass to my loaded items inside the
> ListView
>
> And then, into the source code of QML component I can use the model like
> that:
>
> Text {
>
> text: models.hotel.description
>
> }
>
> Text {
>
> text: models.hotel.city_and_country+' '+models.hotel.address+'
> '+models.hotel.postcode
>
> }
>
>
> Do you like it ?
>
>
> Ciao,
> Gianluca.
>
>
> Best regards,
> Elvis
> _______________________________________________
> Interest mailing list
> Interest@qt-project.org
> http://lists.qt-project.org/mailman/listinfo/interest
>
>
>
_______________________________________________
Interest mailing list
Interest@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest

Reply via email to