Как добавить дополнительные данные в элементы 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
, но это потребовало бы много мучительной работы и доступа к частным заголовкам.