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分离的有用说明。这将导致编写代码时的不便和运行缓慢。如果我错了,也许可以提供一个代码示例来演示我真的想知道它是什么,尽管我知道我应该去看源代码。