QML/QtQuick将委托的属性与ListView的currentIndex绑定

QML/QtQuick将委托的属性与ListView的currentIndex绑定,qt,listview,delegates,qml,Qt,Listview,Delegates,Qml,在委托内部,我将图像的源属性绑定到ListView的currentIndex,后者决定加载哪个图像。这非常有效: ListView { id: answerListView model: 5 currentIndex: -1 delegate: answerDelegate } Component { id: answerDelegate Item { width: 100 height: 100

在委托内部,我将图像的源属性绑定到ListView的currentIndex,后者决定加载哪个图像。这非常有效:

ListView {
    id: answerListView
    model: 5
    currentIndex: -1
    delegate: answerDelegate
}    

Component {
    id: answerDelegate
    Item {
        width: 100
        height: 100
        Image {
            source: answerListView.currentIndex === index
                        ? "selected.png" : "not_selected.png"
        }
        MouseArea {
            anchors.fill: parent
            onClicked: {
                answerListView.currentIndex = index
            }  
        }
        Component.onCompleted: {
            answerListView.currentIndex = 1; // doesn't work!!
        } 
    }
}
由于currentIndex:-1,它将始终显示not_selected.png。为了显示selected.png,我在委托内部更改Component.onload中的currentIndex

自从currentIndex更新后,我希望图像加载selected.png。 正确的方法是什么?我在这里误解了什么

好的,新的猜测: 您希望能够选择多个项目。由于currentIndex只存储一个值,即您上次分配给它的值,因此您可以使用它仅标记一项

因此,您需要找到另一种方法来存储您的选择。例如,您可能在delegate:property bool selected:false中有一个属性,在选择时将其设置为true

这个解决方案的问题是,只有在所有项目都被实例化的情况下,它才有效。一旦一个项目再次被销毁,信息将丢失,在下一次创建时,选择/取消选择将撤消

更好的方法是在模型中引入一个角色,该角色将选择存储在非持久代理之外:

ListView {
    id: answerListView
    model: lm
    delegate: answerDelegate
    width: 100
    height: 220
}
ListModel {
    id: lm
    ListElement { selected: false }
    ListElement { selected: false }
    ListElement { selected: false }
    ListElement { selected: false }
    ListElement { selected: false }
}

Component {
    id: answerDelegate
    Item {
        width: 100
        height: 100
        Image {
            anchors.fill: parent
            source: model.selected ? "selected.png" : "notselected.png"
        }

        Text {
            text: (model.selected ? 'selected ' : 'notselected ')
        }
        Component.onCompleted: {
            model.selected = true // doesn't work!!
        }
        MouseArea {
            anchors.fill: parent
            onClicked: {
                model.selected = !model.selected
            }
        }
    }
}
另一个选择可能是自动取款机,但我不知道它是如何工作的

否则,您的示例将按预期工作:
此时将显示索引为1的项目,并显示图像selected.png。如果ListView太小,则不会显示所有其他项,但如果显示,则会显示answerListView的notselected.png。currentIndex不等于它们的索引。

对于我来说,编辑代码后,我就可以确定这些内容的维度了。为了真正验证您的问题,请将您的示例设为a,这样我只需要复制您的代码并将其粘贴到QtCreator main.qml中。作为示例图像,您可以使用URL,例如指向stackoverflow.TY中的图像。我已尝试在Component.onCompleted中设置answerListView.currentIndex=索引。但是不起作用这应将所有代理的图像设置为显示selected.png。我了解MouseArea问题,并更新了代码以澄清。所有代表的?answerListView.currentIndex保存一个值。准确地说,具有相应值的一个项目显示为选中。如果要选择多个项目,则应在模型中选择一个角色,或在委托的选定对象中选择一个属性来处理选择。或者一个selectionModel,但我没有再研究它是如何工作的。你的最后一条评论真的帮助了我,我意识到在我的委托中设置currentIndex根本没有意义。我已经把它移到了ListView中,一切正常。