> 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