QML / QtQuick使用ListView的currentIndex绑定委托的属性

时间:2017-03-14 20:56:45

标签: qt listview delegates qml

在委托中,我将Image的from configurations import Configuration class Base(Configuration): # all the base settings here... BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) ... class Develop(Base): # development settings here... DEBUG = True ... class Production(Base): # production settings here... DEBUG = False 属性绑定到ListView的source,它确定要加载的图像。这非常有效:

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中的currentIndex。

由于currentIndex已更新,我期待图片加载Component.onLoaded 什么是正确的方法,我在这里误解了什么?

1 个答案:

答案 0 :(得分:1)

好的,新猜测: 您希望能够选择多个Items。由于currentIndex仅存储一个值,即您最后分配的值,因此您可以使用它仅标记一个Item

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

此解决方案的问题在于,只有在所有Items始终被实例化时才有效。一旦Item再次被销毁,信息将丢失,并且在下一次创建时,选择/取消选择将被撤消。

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

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
            }
        }
    }
}

另一种选择可能是ItemSelectionModel,但我不知道atm,它是如何运作的。

否则您的示例按预期工作:
显示Item index 1,并显示图片selected.png。所有其他Item都没有显示(因为ListView很小)但是如果会显示,则notselected.png显示answerListView.currentIndex不等于他们的{{1}}索引。