Сигнал загрузки всех файлов QFileSystemModel
Здравствуйте эксперты и новички.
Есть ли какой-нибудь способ определить, что QfileSystemModel загрузила всё файлы и каталоги, что-бы можно было повесить на неё прокси модель для фильтрации? Если повесить раньше раскрытия всех каталогов - то модели сбиваются.
Выяснил, что подгрузка данных идёт после раскрытия дерева, для этого повесил метод expandAll на сигнал directoryLoaded.
Может можно как-то реализовать загрузку модели в отдельном потоке и отправить сигнал в основной поток для установки прокси модели после загрузки? Или как-то с canFetchMore реализовать, правда не понятно, какой индекс передавать этому методу, если структура папки неизвестна.
Вот часть кода:
# наследник QFileSystemModel с добавлением доп колонки
self.source_model = CustomFileSystemModel()
self.source_model.setRootPath(path)
self.proxy_model = PeriodFilterProxyModel(
parent=self.tree_view,
filterKeyColumn=4,
recursiveFilteringEnabled=True,
)
self.proxy_model.setSourceModel(self.source_model)
# в доп колонке у меня как раз устанавливаются значения только у файлов
# если папка пустая - она не отображается, что мне и нужно
# если я закомичу setFilterRegExp отобразятся все файлы и пустые папки
self.proxy_model.setFilterRegExp('[0-9]{6}$')
self.tree_view.setModel(self.proxy_model)
self.tree_view.setRootIndex(self.proxy_model.mapFromSource(self.source_model.index(path)))
Ну вот и получается, я хочу накинуть прокси после раскрытия всего дерева, тогда пустые папки не отобразятся, а папки с файлами отобразятся. В этом же коде, как я понимаю, сразу же папка отсеивается так и не раскрывшись, так как у нее нет значения в доп колонке.
Ответы (1 шт):
В общем, решил сделать следующим образом:
Так как QFileSystemModel использует отложенную загрузку в отдельном потоке, решил повесить функцию на сигнал directoryLoaded которая сначала раскрывает дерево expandAll, потом сверяет изначальное количество папок с количеством загруженных QFileSystemModel папок. И если значения равны, значит модель раскрыла все папки и можно повесить на нее прокси для фильтрации.
self.source_model = CustomFileSystemModel()
self.tree_view.setModel(self.source_model)
self.tree_view.setRootIndex(self.source_model.setRootPath(path))
self.source_model.directoryLoaded[str].connect(self.check_loaded_folders)
Деревья раскрываются автоматически методом expandAll, сигнал поступает после каждой раскрывшейся папки
def check_loaded_folders(self):
self.tree_view.expandAll()
self.loaded_folders += 1
if self.loaded_folders == self.folder_count:
self.source_model.directoryLoaded.disconnect(self.check_loaded_folders)
# в методе ниже прокси модель для фильтрации
self.set_proxy_model()
Может кому пригодиться данная информация.