Qml 如何使用索引访问ListView中的委托属性
我想访问Qml 如何使用索引访问ListView中的委托属性,qml,qt5,qtquick2,Qml,Qt5,Qtquick2,我想访问列表视图中的代理属性。我试过使用contentItem,但有时它是未定义的 这是我的代码: ListModel{ id: modeldata ListElement{ name:"don" rank:1 } ListElement{ name:"shan" rank:
列表视图
中的代理属性。我试过使用contentItem
,但有时它是未定义的
这是我的代码:
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
首先:如果您试图从列表之外访问列表元素,这是一个很好的指标,您应该重新考虑您的设计 现在解决方案是:listview的子项多于它的项。您可以通过定义一个属性“property string type:“myType”来过滤掉它们,例如。然后通过在子项上循环找到这些项,只取type属性等于“myType”的项。
这有点像黑客,但你一开始真的不应该这么做。@Teimpz没有很好地解释它。特别是因为有很多qt项目和UbuntuTouchQML示例和用例,您可以使用javascript管理动态创建的列表元素,这就是为什么它们有javascript方法和属性 在QML中,父概念多于子概念,这在html中很常见。在更大的项目中,建议(正如您在qt示例和文档中所看到的)将js逻辑与qml元素分开,这样您就可以从外部访问和管理元素,而不是用js逻辑污染qml元素,但不是以查找子元素的方式,而是公开您需要的子元素 在您的情况下,您应该只使用
currentItem
,就像使用currentIndex一样,因此currentItem.count
将为您提供所需的内容。
如果您根本不需要当前项,则可以直接从模型访问图元:
modelData.get(currentIndex.count)或listview.model.get(currentIndex.count
至于@Teimpz提到的黑客,这也是一个坏例子。当您有更复杂的需求并且希望在委托中包含特定元素时,每个委托都具有ListView.isCurrentItem属性,您可以附加并检查该属性。这意味着您可以将属性var myTargetItem添加到listview,并将其从child设置为您想要的任何元素(如果该委托是当前的)
当然,对于任何类型的事件都可以这样做,可能是activeFocus,所以只能引用activeFocused项
这再次使您能够只公开想要的元素,而无需任何高级逻辑或删除。结合这些信号,您可以创建非常复杂但干净的界面,而无需搜索子项
因此,最终可能不如搜索元素好,但仍然比搜索元素更好的是将属性int currentItemCount:0
添加到listview。然后在委托(行元素)中添加属性bool isCurrentItem:ListView.isCurrentItem
因此,您可以在委托内获得onIsCurrentItemChanged
信号,您可以在其中执行以下操作:
onIsCurrentItemChanged:if(isCurrentItem)listview.currentItemCount=count
因此,您的当前项目计数始终处于设置状态感谢您提供有关将js逻辑与qml分离的有用说明。这将导致编写代码时的不便和运行缓慢。如果我错了,也许可以提供一个代码示例来演示我真的想知道它是什么,尽管我知道我应该去看源代码。