带有CheckDelegate项目的ListView在滚动

时间:2018-04-01 20:29:42

标签: python listview pyqt qml pyqt5

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很新,我怎么能这样做? 谢谢。

1 个答案:

答案 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 的子类或简单列表。

     

另见数据模型。