Сигнал загрузки всех файлов 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()

Может кому пригодиться данная информация.

→ Ссылка