[Interest] Awkwardness of delegates in heterogenous ListViews

Elvis Stansvik elvstone at gmail.com
Thu Jun 9 07:54:23 CEST 2016


2016-06-08 23:59 GMT+02:00 Jason H <jhihn at gmx.com>:
> I'm coming into this late, but can't you just set up:
>
> Item { // delegate
>
>   Item {
>     id: view1
>      visible: some_data_item_property == true
>   }
>   Item {
>     id: view2
>     visible: !view1.visible
>   }
> }
>
> Then make view1 and view2 your different delegates? You're just going after
> two diferent views, right?

Well it's ~5, but indeed that seems to work great! A little test:


import QtQuick 2.4
import QtQuick.Window 2.2

import "."

Window {
    title: "Test"
    width: 600
    height: 900
    visible: true

    ListModel {
        id: listModel
        dynamicRoles: true
        Component.onCompleted: {
            append({
                "type": "color",
                "name": "foo",
                "value": "red"
            });
            append({
                "type": "flag",
                "name": "bar",
                "value": false
            });
            append({
                "type": "choice",
                "name": "bar",
                "value": "Foo",
                "choices": ["Foo", "Bar"]
            });
        }
    }

    ListView {
        anchors.fill: parent

        model: listModel
        delegate: Rectangle {
            implicitHeight: {
                if (type === "color")
                    return colorDelegate.implicitHeight
                if (type === "flag")
                    return flagDelegate.implicitHeight
                if (type === "choice")
                    return choiceDelegate.implicitHeight
            }
            Text {
                id: colorDelegate
                text: value + " (color)"
                visible: type === "color"
            }
            Text {
                id: flagDelegate
                text: value + " (flag)"
                visible: type === "flag"
            }
            Text {
                id: choiceDelegate
                text: value + " (choice)"
                visible: type === "choice"
            }
        }
    }
}


I wonder why I haven't seen this approach before while searching around.

Elvis

>
> Sent: Wednesday, June 08, 2016 at 11:49 AM
> From: "Elvis Stansvik" <elvstone at gmail.com>
> To: "Kristoffersen, Even (NO14)" <Even.Kristoffersen at honeywell.com>,
> "interest at qt-project.org Interest" <interest at qt-project.org>
>
> Subject: Re: [Interest] Awkwardness of delegates in heterogenous ListViews
>
> 2016-06-08 15:41 GMT+02:00 Kristoffersen, Even (NO14)
> <Even.Kristoffersen at honeywell.com>:
>> Have you tried something like this in the delegate?
>>
>> property alias some_descriptive_name: parent
>
> It seems it's not allowed to use parent as the target of an alias (?):
>
> file:///home/estan/qte/qte/qml/ItemDelegate.qml:5 Invalid alias reference.
> Unable to find id "parent"
>
> And this would still tie my "subdelegates" to this structure. They could not
> be reused in other places, where lists are homogenous and I'm not using the
> Loader approach.
>
> But I guess there's really no way to make a delegate that can be used in
> both the "normal" situation and in the indirect-through-Loader approach.
>
> Elvis
>
>>
>> (Not tested, just an idea)
>>
>> -Even
>>
>> -----Original Message-----
>> From: Interest
>> [mailto:interest-bounces+even.kristoffersen=honeywell.com at qt-project.org] On
>> Behalf Of Elvis Stansvik
>> Sent: 8. juni 2016 15:34
>> To: interest at qt-project.org Interest <interest at qt-project.org>
>> Subject: Re: [Interest] Awkwardness of delegates in heterogenous ListViews
>>
>> 2016-06-08 15:32 GMT+02:00 Elvis Stansvik <elvstone at gmail.com>:
>>> 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
>>
>> I should clarify: I have to use this notation since it is the parent (the
>> Loader) which is the real delegate and has the ListView attached properties.
>>
>> Elvis
>>
>>> 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?
>>>
>>> Best regards,
>>> Elvis
>> _______________________________________________
>> 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



More information about the Interest mailing list