Как добавить дополнительные данные в элементы qfilesystemmodel?

Я пытаюсь создать приложение pyqt, которое проверяет структуру каталогов и файлы в нем. Я хочу добавить некоторую дополнительную информацию к элементам в qfilesystemmodel, например, пометить файлы как "отмеченные" или "не отмеченные". Я обнаружил, что каждый элемент (файл или папка) в модели имеет четыре столбца: имя, размер, метку времени и тип. Можно ли сделать элемент пятым столбцом, который будет содержать пользовательскую информацию (теги)? Или есть ли способ аннотировать дополнительную информацию об элементах в модели? Если нет, я думаю, что мне нужна другая модель, например, qstanarditemmodel, чтобы сохранить теги. Но я не хочу, чтобы это было в отчаянной модели. Спасибо!

2 ответа

Решение

QFileSystemModel делегаты класса в живую файловую систему. Таким образом, он не содержит никаких элементов, к которым вы можете добавить информацию. Элементы - это файлы и каталоги внутри файловой системы.

Исходя из этого, из этого следует, что для хранения дополнительной информации потребуется вторая структура данных. В противном случае вам нужно как-то хранить информацию в самих файлах и каталогах. Это может быть возможно для определенных типов файлов (например, изображений). Но, очевидно, это невозможно сделать для произвольных типов файлов.

Должно быть возможно подкласс QFileSystemModel и переопределить обычные методы, чтобы можно было добавить дополнительные столбцы. Как минимум, вам нужно будет переопределить 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)

Короче нет, не легко. Разработчики Qt перестали работать над QFileSystemModel по причинам сложности. По сути, ядро ​​файловой системы слишком сложное и хрупкое, и QFileSystemModel полностью полагается на это.

Вы могли бы переопределить QFileSystemModel, но это потребовало бы много мучительной работы и доступа к частным заголовкам.

Другие вопросы по тегам