Как получить доступ к данным 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