QT: слот QFileSystemModel _q_fileSystemChanged выполняется в потоке пользовательского интерфейса, что противоречит документации
Мой пользовательский интерфейс использует QTreeView с QFileSystemModel, чтобы иметь возможность выбирать папки и файлы. В документации по QFileSystemModel говорится, что обновление файловой структуры выполняется в отдельном потоке, что означает, что пользовательский интерфейс не будет заблокирован. Тем не менее, это не так для меня, и я не могу понять, несоответствие и как другие люди не сталкиваются с этой проблемой. После отладки я заметил, что слот QFileSystemModel _q_fileSystemChanged, который занимает большую часть времени, все еще выполняется в основном потоке пользовательского интерфейса, что имеет смысл. Вопрос в том, как утверждается в документации, что он не будет блокировать пользовательский интерфейс. Есть ли решение? Я что-то неправильно понимаю?
Чтобы воспроизвести - Создать QTreeView с QFileSystemDataModel - Установить корневой путь в "" или "/" - Установить точку останова в слоте QFileSystemModel _q_fileSystemChanged - Развернуть один из дисков после загрузки приложения
Проблема: - Слот вызывается в потоке пользовательского интерфейса, таким образом блокируя приложение до его завершения.
Есть способы ускорить анализатор файлов, но мне действительно нужно выполнить его в отдельном потоке и уведомить, когда данные заполнятся и будут готовы для QTreeView.
Спасибо, Иннокентий
1 ответ
I think the reason for this could be the icons. В пределах _q_fileSystemChanged()
слот fileInfoGatherer.getInfo()
gets called which - among other things - resolves the icons for the paths. In it's current design QFileIconProvider
использования QIcon
to represent icons and QIcon
can only be used in the UI thread. QImage
seems to be the only class allowed to use in other threads, but I think it may be to expensive to use QImage
in the background thread and convert it to an QIcon
в потоке пользовательского интерфейса.
Так что вполне возможно, что реализация платформы QFileIconProvider
при некоторых обстоятельствах медленен на сетевых путях и поэтому замедляет основной поток пользовательского интерфейса.
Я не знаю, является ли это источником вашей проблемы, но, по крайней мере, это должно быть причиной, почему _q_fileSystemChanged()
вызывается в потоке пользовательского интерфейса.