从Delegate访问Listview currentIndex

dh1*_*1tw 5 qt qml qtquick2 qqmlcomponent

我有一个QML ListView,其中委托从另一个文件加载它的组件.单击委托项时,我想要更新ListView.CurrentIndexhighlight所选项目.

它工作,当我明确设置idListView.但是,由于我想将委托Component也用于其他ListViews,我正在努力寻找一种如何ListView.currentIndex从委托中访问的通用方法Component.

这是代码:

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{}
    }
}
Run Code Online (Sandbox Code Playgroud)

Contact.qml(委托使用的组件)

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

任何帮助真的很感激!

Mit*_*tch 12

这里有两个问题:

要修复它们,首先要更改:

ListView.currentIndex = index;
Run Code Online (Sandbox Code Playgroud)

对此:

delegate.ListView.view.currentIndex = index;
Run Code Online (Sandbox Code Playgroud)

然后给你的代表一个id:

Component {
    id: contact

    Rectangle {
        id: delegate
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这部分由文档的Example Usage部分演示:

ListView将许多属性附加到委托的根项,例如ListView:isCurrentItem.在以下示例中,根委托项可以直接以ListView.isCurrentItem的形式访问此附加属性,而子contactInfo对象必须将此属性称为wrapper.ListView.isCurrentItem.