本质上,我有一个常用的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分配的委托,并查看javascript循环中mylistDelegateTextEnabled的值。例如,这个循环遍历当前列表,并为我提供模型中ListElement的文本:
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);
}
唉,这似乎没那么容易。
感谢您的帮助。
您不能以这种方式访问委托,因为它们是由ListView
自行创建和销毁的瞬态对象。如代表文档中所述:
委托会根据需要实例化,并且可能随时被销毁。状态永远不应存储在委托中。
为什么不能在ListModel
中添加textEnabled
标志?例如:
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