Как получить доступ к данным ListModel listelement сопоставленного делегата ListView в QML?

По сути, у меня есть обычный 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
    }
}

Пожалуйста, игнорируйте любые проблемы, которые я мог бы ввести, усекая код, чтобы сосредоточиться на том, что важно.

В любом случае, теперь моя проблема в том, что я хочу получить доступ к назначенному делегату ListElement и посмотреть, что значение mylistDelegateTextEnabled находится в цикле javascript. Например, этот цикл повторяет текущий список и дает мне текст элементов ListElements в модели:

for(var i = 0; i < mylistModel.count; ++i) {
    console.log(mylistModel.get(i).text);
}

этот очевидно, работает отлично.

Теперь то, что я хочу, по существу таково:

for(var i = 0; i < mylistModel.count; ++i) {
    console.log(mylistModel.get(i).text);
    console.log(mylistModel.get(i).delegate.mylistDelegateTextEnabled);
}

увы, это не так просто.

помощь оценили.

2 ответов


вы не можете получить доступ к делегатам таким образом, потому что они транзиторная объекты, которые создаются и уничтожаются по усмотрению ListView. Как объясняется в документация для делегатов:

делегаты создаются по мере необходимости и могут быть уничтожены в любое время. Состояние никогда не должно храниться в делегате.

есть ли особая причина, по которой вы не можете просто добавить textEnabled флаг ListModel? Для пример:

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

    }      
}

попробуйте этот код:-

 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;
   }

надеюсь, это поможет, ура!!! @ navi