在委托中,我将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
什么是正确的方法,我在这里误解了什么?
答案 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}}索引。