如何向 qfilesystemmodel 项添加额外数据?

How to add extra data to qfilesystemmodel items?

我正在尝试制作一个 pyqt 应用程序,它检查目录结构和其中的文件。 我想要做的是向 qfilesystemmodel 中的项目添加一些额外的信息,例如,将文件标记为 'checked' 或 'unchecked'。 我发现模型中的每个项目(文件或文件夹)都有四列,名称、大小、时间戳和类型。 是否可以使项目有第五列,其中将包含自定义信息(标签)? 或者,有没有办法在模型中的项目上注释额外信息? 如果没有,我想我必须有另一个模型,比如 qstanarditemmodel,来保留标签。但我不希望它处于分离模型中。 谢谢!

总之,不,不容易。由于复杂性原因,Qt 开发人员停止了 QFileSystemModel 的工作。基本上,后端文件系统引擎过于复杂和脆弱,QFileSystemModel 完全依赖它。

可以重新实现QFileSystemModel,但这需要很多痛苦的工作和访问私有头文件。

QFileSystemModel class 委托给实时文件系统。所以它实际上 不包含 任何您可以添加信息的项目。这些项目实际上是文件系统中的文件和目录。

鉴于此,需要第二个数据结构来保存附加信息。否则,您需要以某种方式将信息存储在文件和目录本身中。这可能适用于某些文件类型(例如图像)。但是对于 任意 文件类型,这样做显然是不可行的。

应该可以子 class QFileSystemModelreimplement the usual methods 以便添加额外的列。作为最低限度,您需要重新实现 columnCount()data() - 但显然,您如何执行此操作的具体细节将取决于您选择保存附加信息的数据结构。非常粗略地说,它可能看起来像这样:

class FileSystemModel(QFileSystemModel):
    def __init__(self, parent=None):
        super(FileSystemModel, self).__init__(parent)
        self._data = DataStructure()

    def columnCount(self, parent):
        return super(FileSystemModel, self).columnCount(parent) + 1

    def data(self, index, role):
        if index.isValid() and index.column() == self.columnCount() - 1:
            if role == QtCore.Qt.DisplayRole:
                # return the relevant additional data
            elif role == QtCore.Qt.CheckStateRole:
                # etc, etc
        else:        
            return super(FileSystemModel, self).data(index,role)