Essentially, I have an usual ListView:
Rectangle {
    id: mylist
    ListModel {
        id: mylistModel
        ListElement {
            text: "blah1"
        }
        ListElement {
            text: "blah2"
        }
        ListElement {
            text: "blah3"
        }
    }
    Component {
        id: mylistDelegate
        Text {
            id: mylistDelegateText
            text: text
            property bool mylistDelegateTextEnabled: false
        }
    }
    ListView {
        id: mylistView
        model: mylistModel
        delegate: mylistDelegate
    }
}
Please ignore any problems I might have introduced by truncating the code to focus on what's important.
Anyway, now my problem is that I want to access a ListElement's assigned delegate and see what the value of mylistDelegateTextEnabled is in a javascript loop. For instance, this loop iterates over current list and gives me the text of the ListElements in the model:
for(var i = 0; i < mylistModel.count; ++i) {
    console.log(mylistModel.get(i).text);
}
This obviously works fine.
Now what I want is essentially this:
for(var i = 0; i < mylistModel.count; ++i) {
    console.log(mylistModel.get(i).text);
    console.log(mylistModel.get(i).delegate.mylistDelegateTextEnabled);
}
Alas, that it doesn't seem to be that easy.
Help appreciated.
You can't access delegates in that way because they are transient objects that are created and destroyed at the discretion of the ListView.  As explained in the documentation for delegates:
Delegates are instantiated as needed and may be destroyed at any time. State should never be stored in a delegate.
Is there a particular reason why you can't just add a textEnabled flag to the ListModel? For example:
import QtQuick 1.0
Rectangle {
    id: mylist
    width:300
    height:300
    ListModel {
        id: mylistModel
        ListElement {
            name: "blah1"
            textEnabled:false
        }
        ListElement {
            name: "blah2"
            textEnabled:false
        }
        ListElement {
            name: "blah3"
            textEnabled:false
        }
    }
    Component {
        id: mylistDelegate
        Text {
            id: mylistDelegateText
            text: name
            color: textEnabled?"red":"black"
            MouseArea {
                anchors.fill:parent;
                onClicked: {
                    mylistModel.setProperty(index, "textEnabled", !textEnabled);
                }
            }
        }
    }
    ListView {
        id: mylistView
        model: mylistModel
        delegate: mylistDelegate
        width:100;
        height:100
    }      
}
                        Try this code:-
 for (var i = 0; i < mylistView.count; i ++) {
      // this will get list item at index i
      console.log(mylistView.contentItem.children[i]);
      // lets set it height to 100
      mylistView.contentItem.children[i].height=100;
   }
Hope this helps, cheers!!! @navi
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With