Access Listview currentIndex from Delegate

前端 未结 2 1230
故里飘歌
故里飘歌 2021-02-03 15:07

I have a QML ListView where the delegate loads it\'s component from another file. When clicking on an delegate item, I want to update ListView. C

相关标签:
2条回答
  • 2021-02-03 15:35

    There are two problems here:

    • You need to qualify ListView's attached properties with the name of the item from which they're accessed.
    • The currentIndex property is a property of the ListView item type, not the attached property object.

    To fix them both, first change this:

    ListView.currentIndex = index;
    

    to this:

    delegate.ListView.view.currentIndex = index;
    

    And then give your delegate an id:

    Component {
        id: contact
    
        Rectangle {
            id: delegate
        // ...
    }
    

    This is demonstrated (in part) by the Example Usage section of the documentation:

    ListView attaches a number of properties to the root item of the delegate, for example ListView:isCurrentItem. In the following example, the root delegate item can access this attached property directly as ListView.isCurrentItem, while the child contactInfo object must refer to this property as wrapper.ListView.isCurrentItem.

    0 讨论(0)
  • 2021-02-03 15:38

    Use attached property ListView.view:

    This attached property holds the view that manages this delegate instance

    Small example:

    import QtQuick 2.4
    import QtQuick.Window 2.2
    import QtQuick.Layouts 1.1
    
    Window {
        width: 600
        height: 400
        visible: true
    
        Component {
            id: listDelegate
            Rectangle {
                height: 30
                width: parent.width
                color:  ListView.isCurrentItem ? "orange" : "white"
                property var view: ListView.view
                property int itemIndex: index
                Text { anchors.centerIn: parent; text: name }
                MouseArea {
                    anchors.fill: parent
                    onClicked: {
                        view.currentIndex = itemIndex;
                    }
                }
            }
        }
    
        RowLayout {
            anchors.fill: parent
            ListView {
                Layout.minimumWidth: parent.width / 2
                Layout.fillHeight: true
                model: ListModel {
                    ListElement {name: "item1.1"}
                    ListElement {name: "item1.2"}
                    ListElement {name: "item1.3"}
                }
                delegate: listDelegate
            }
            ListView {
                Layout.minimumWidth: parent.width / 2
                Layout.fillHeight: true
                model: ListModel {
                    ListElement {name: "item2.1"}
                    ListElement {name: "item2.2"}
                    ListElement {name: "item2.3"}
                }
                delegate: listDelegate
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题