Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Access Listview currentIndex from Delegate

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. CurrentIndex and highlight the selected item.

It works, when I explicitly set the id of the ListView. However since I want to use the delegate's Component also for other ListViews, I'm stuggeling to find a generic way how to access ListView.currentIndex from within a delegate Component.

Here is the Code:

main.qml

import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2

ApplicationWindow {
    title: qsTr("Hello World")
    width: 640
    height: 480
    visible: true

    ListModel {
        id: contactsModel
        ListElement {
            name: "Bill Smith"
        }
        ListElement {
            name: "John Brown"
        }
        ListElement {
            name: "Sam Wise"
        }
    }

    ListView{
        id: contactsView
        anchors.left: parent.left
        anchors.top: parent.top
        width: parent.width
        height: parent.height
        orientation: Qt.Vertical
        spacing: 10
        model: contactsModel
        delegate: Contact{}
    }
}

Contact.qml (Component used by delegate)

import QtQuick 2.0

Component{
    id: contact
    Rectangle{
        width: 200
        height: 50
        color: ListView.isCurrentItem ? "#003366" : "#585858"
        border.color: "gray"
        border.width: 1

        MouseArea{
            anchors.fill: parent
            onClicked: {
                ListView.currentIndex = index; // <---- does not work
                //  contactsView.currentIndex = index; // <---- Works
            }
        }

        Text{
            anchors.centerIn: parent
            color: "white"
            text: name
        }
    }
}

Any help is really appreciated!

like image 521
dh1tw Avatar asked Aug 12 '15 13:08

dh1tw


1 Answers

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.

like image 54
Mitch Avatar answered Oct 14 '22 04:10

Mitch