【问题标题】:ListView with CheckDelegate items not keeping Checked Checkboxes when scrolling滚动时带有 CheckDelegate 项目的 ListView 不保留选中的复选框
【发布时间】:2018-09-11 03:25:27
【问题描述】:

你好,所以我有一个简单的脚本,它在 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 非常陌生,我该怎么做? 谢谢。

【问题讨论】:

    标签: python listview pyqt qml pyqt5


    【解决方案1】:

    如果分析问题,观察到如果您将列表移动一点并返回到初始位置,更改将保持正确的值,并且当您像您的情况一样移动很多时,更改是丢失。

    为什么会这样?

    造成这种现象的原因是为了提高效率 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 {}
            }
        }
    }
    

    其他可能的容器可能正在使用其他models:

    型号:型号

    此属性保存为列表提供数据的模型。

    模型提供用于创建项目的数据集 风景。可以使用 ListModel 在 QML 中直接创建模型, XmlListModelVisualItemModel,或由 C++ 模型类提供。如果使用 C++ 模型类,它必须是 QAbstractItemModel 的子类或简单列表。

    另请参阅数据模型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-13
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多