Holla,所以我有这个简单的脚本,在GUI中显示100个元素,每个元素都有一个复选框,我可以检查框,它们会保持检查一段时间,但如果我向上或向下滚动直到它们出来视图他们将重置(有时只会检查第一个元素)。 现在我知道在ListView中,元素一旦进入视图就会显示出来,并且我尝试了多种内容,例如增加ListView高度,ContentHeight,但没有任何效果。 这个问题与RadioDelegate相同 Main.py文件:
from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5.QtGui import QGuiApplication
from PyQt5.QtCore import QObject, QUrl,QTimer
import sys
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine('main.qml')
sys.exit(app.exec_())
main.qml:
import QtQuick 2.0
import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3
ApplicationWindow {
visible: true
width: 400
height: 550
title: qsTr("Ttile")
ColumnLayout {
anchors.fill: parent
ListView {
id: listView
objectName : "lvob"
model: 100
delegate: CheckDelegate {
text: modelData
}
Layout.fillWidth: true
Layout.fillHeight: true
ScrollBar.vertical: ScrollBar {}
}
}
}
视频说明:Click Me
我做错了什么? 更新:经过一些研究后我发现我必须将已检查的项目存储在一个数组中,因为我对python / qml很新,我怎么能这样做? 谢谢。
答案 0 :(得分:2)
如果分析问题,则会发现如果您稍微移动列表并返回初始位置,则更改将保持正确的值,并且当您按照您的情况移动很多时,更改是丢失。
这种现象的产生是因为为了提高效率,ListView有一个名为cacheBuffer
的属性,可以保留一些项目。
然后,解决方案是将更改保存在一些其他元素中,这些元素将数据持久存储为ListModel
:
ApplicationWindow {
visible: true
width: 400
height: 550
title: qsTr("Ttile")
ListModel {
id: checkmodel
Component.onCompleted: {
for(var i = 0; i < 100; i++){
checkmodel.append({"name": i, "value": false})
}
}
}
ColumnLayout {
anchors.fill: parent
ListView {
id: listView
objectName : "lvob"
model: checkmodel
delegate: CheckDelegate {
text: name
checked: value
onCheckStateChanged: checkmodel.setProperty(index ,"value", checked)
}
Layout.fillWidth: true
Layout.fillHeight: true
ScrollBar.vertical: ScrollBar {}
}
}
}
其他可能的容器可能正在使用其他model
s:
型号:型号
此属性包含为列表提供数据的模型。
该模型提供用于创建项目的数据集 风景。可以使用 ListModel 直接在QML中创建模型, XmlListModel 或 VisualItemModel ,或由C ++模型类提供。如果使用C ++模型类,它必须是 QAbstractItemModel 的子类或简单列表。
另见数据模型。