QT: слот QFileSystemModel _q_fileSystemChanged выполняется в потоке пользовательского интерфейса, что противоречит документации - PullRequest
4 голосов
/ 30 октября 2010

Мой пользовательский интерфейс использует QTreeView с QFileSystemModel, чтобы иметь возможность выбирать папки и файлы.В документации по QFileSystemModel говорится, что обновление файловой структуры выполняется в отдельном потоке, что означает, что пользовательский интерфейс не будет заблокирован.Тем не менее, это не так для меня, и я не могу понять, несоответствие и как другие люди не сталкиваются с этой проблемой.После отладки я заметил, что слот QFileSystemModel _q_fileSystemChanged, который занимает большую часть времени, все еще выполняется в главном потоке пользовательского интерфейса, что имеет смысл.Вопрос в том, как утверждается в документации, что он не будет блокировать пользовательский интерфейс.Есть ли решение?Я что-то неправильно понимаю?

Чтобы воспроизвести - Создать QTreeView с QFileSystemDataModel - Установить корневой путь равным "" или "/" - Установить точку останова в слоте QFileSystemModel _q_fileSystemChanged - Расширить один из дисков после загрузки приложения

Проблема: - Слот вызывается в потоке пользовательского интерфейса, таким образом блокируя приложение до его завершения.

Есть способы ускорить анализатор файлов, но мне действительно нужно выполнить его в отдельном потоке и уведомитькогда данные заполнены и готовы для QTreeView.

Спасибо, Innokenty

1 Ответ

4 голосов
/ 31 октября 2010

Я думаю, что причиной этого могут быть значки.В слоте _q_fileSystemChanged() вызывается fileInfoGatherer.getInfo(), который, среди прочего, разрешает значки путей.В текущем дизайне QFileIconProvider использует QIcon для представления значков, а QIcon может использоваться только в потоке пользовательского интерфейса.QImage кажется единственным классом, разрешенным для использования в других потоках, но я думаю, что может быть дорого использовать QImage в фоновом потоке и преобразовать его в QIcon в потоке пользовательского интерфейса.1010 * Таким образом, вполне возможно, что реализация платформы QFileIconProvider медленна на сетевых путях при некоторых обстоятельствах и поэтому замедляет основной поток пользовательского интерфейса.

Я не знаю, является ли это источником вашей проблемы, но по крайней мере это должно быть причиной, по которой _q_fileSystemChanged() вызывается в потоке пользовательского интерфейса.

...