我想访问ListView
中的委托属性。我已尝试contentItem
,但有时候undefined
。
这是我的代码:
ListModel{
id: modeldata
ListElement{
name:"don"
rank:1
}
ListElement{
name:"shan"
rank:2
}
ListElement{
name:"james"
rank:3
}
ListElement{
name:"jeggu"
rank:4
}
}
Component{
id: delegateitem
Row {
property int count: rank
Rectangle{
width: 100
height: 50
Text{
anchors.centerIn: parent
text: name
}
}
}
}
ListView{
id: listview
focus: true
anchors.fill: parent
model: modeldata
delegate: delegateitem
onCurrentIndexChanged: {
console.log("position",currentIndex)
console.log("property",contentItem.children[currentIndex].count);
}
}
位置1的问题无效
qml: position 0
qml: property 1
qml: position 1
qml: property undefined
qml: position 2
qml: property 2
qml: position 3
qml: property 3
答案 0 :(得分:5)
@Teimpz并没有真正解释清楚。特别是因为有大量的qt项目和ubuntu touch qml示例以及使用javascript管理动态创建的列表元素的用例,这就是为什么他们有javascript方法和属性
在QML中,父母的概念多于孩子,这在html中很常见。在更大的项目中,建议(正如您可以在qt示例和文档http://doc.qt.io/qt-5/qtqml-javascript-expressions.html#functions-in-imported-javascript-files中看到的)将js逻辑与qml元素分开,这样您就可以从外部访问和管理元素,而不是使用js逻辑污染qml元素,但不是寻找儿童元素,而是暴露你需要的儿童元素。
在您的情况下,您应该使用currentItem
,与使用currentIndex相同,因此currentItem.count
会为您提供所需内容。
如果您根本不需要当前项目,则可以直接从模型中访问元素:
modelData.get(currentIndex).count
或listview.model.get(currentIndex).count
至于@Teimpz提到的hack也是一个不好的例子。当您有更复杂的需求并希望委托中的特定元素时,每个委托都有ListView.isCurrentItem属性,您可以附加和检查它。这意味着您可以将属性var myTargetItem添加到listview,并将其设置为child,如果该委托是最新的http://doc.qt.io/qt-5/qml-qtquick-listview.html#isCurrentItem-attached-prop
,则将其设置为您想要的任何元素您当然可以为任何类型的活动执行此操作,也许是activeFocus,因此您只能引用activeFocused项目。
这再次使您能够在没有任何高级逻辑或删除的情况下仅公开所需元素。将此与信号相结合,您可以创建非常复杂但干净的界面,而无需搜索子项。
所以最后可能不太好但比搜索元素更好的是将property int currentItemCount: 0
添加到listview。在委托(行元素)中,然后添加property bool isCurrentItem: ListView.isCurrentItem
所以你在委托中得到onIsCurrentItemChanged
信号,你可以在那里做:
onIsCurrentItemChanged: if(isCurrentItem) listview.currentItemCount = count
所以你总是设置你当前的项目数
答案 1 :(得分:0)
首先:如果您尝试从列表外部访问列表元素,这是一个很好的指标,您应该重新考虑您的设计。
现在的解决方案:listview拥有的子项多于其项目。您可以通过定义属性“属性字符串类型:”myType“”来过滤它们。然后通过循环遍历子项找到项目,并且只接受type属性等于“myType”的项目。 它有点像黑客,但你首先应该真的不应该这样做。