如何在 QML 中访问 ListView 的 ListModel 的 ListElement 的映射委托数据?
Posted
技术标签:
【中文标题】如何在 QML 中访问 ListView 的 ListModel 的 ListElement 的映射委托数据?【英文标题】:How to access a ListView's ListModel's ListElement's mapped delegate's data in QML? 【发布时间】:2012-03-19 18:34:36 【问题描述】:基本上,我有一个常用的 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);
唉,这似乎并不那么容易。
帮助表示赞赏。
【问题讨论】:
【参考方案1】:您不能以这种方式访问委托,因为它们是 transient 对象,由ListView
自行创建和销毁。正如documentation 中为代表解释的那样:
委托会根据需要进行实例化,并且可以随时销毁。 状态永远不应该存储在委托中。
有什么特殊原因不能将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
【讨论】:
感谢您的回答!我试过并得到错误:无法分配给只读属性“textEnabled”。是的,我想从 QML 而不是 JS 分配。我可以这样做吗? 我认为您尝试从委托中设置textEnabled
标志的错误将不起作用。相反,直接使用model.setProperty()
更新模型。我将更新我的答案以这种方式进行演示,而不是使用Component.onCompleted
。【参考方案2】:
试试这个代码:-
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;
希望这会有所帮助, 干杯!!! @导航
【讨论】:
以上是关于如何在 QML 中访问 ListView 的 ListModel 的 ListElement 的映射委托数据?的主要内容,如果未能解决你的问题,请参考以下文章