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
There are two problems here:
ListView
's attached properties with the name of the item from which they're accessed.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.
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
}
}
}