如何使用索引访问ListView中的委托属性

Jeg*_*ggu 3 qml qt5 qtquick2

我想访问委托属性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);
            }
        }
Run Code Online (Sandbox Code Playgroud)

在位置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
Run Code Online (Sandbox Code Playgroud)

Pet*_*tar 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提到的黑客也是一个不好的例子.当您有更复杂的需求并希望委托中的特定元素时,每个委托都有ListView.isCurrentItem属性,您可以附加和检查它.这意味着您可以将属性var myTargetItem添加到listview,并将其设置为child,如果该委托是当前的http://doc.qt.io/qt-5/qml-qtquick-listview.html#isCurrentItem,则将其设置为您想要的任何元素-attached螺旋桨

您当然可以为任何类型的事件执行此操作,也许是activeFocus,因此您只能引用activeFocused项目.

这再次使您能够在没有任何高级逻辑或删除的情况下仅公开所需元素.将此与信号相结合,您可以创建非常复杂但干净的界面,而无需搜索子项.

所以最后可能不太好但仍然比搜索元素更好的是添加property int currentItemCount: 0到listview.在委托(行元素)中,然后添加,property bool isCurrentItem: ListView.isCurrentItem 以便onIsCurrentItemChanged在委托中获取信号,您可以在其中执行: onIsCurrentItemChanged: if(isCurrentItem) listview.currentItemCount = count 因此您始终设置当前项目计数