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

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

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

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

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

Спасибо, Иннокентий.


person Innokenty    schedule 29.10.2010    source источник
comment
Действительно ли ваше приложение зависает, если не выполняется отладка с помощью точки останова?   -  person Arnold Spence    schedule 30.10.2010
comment
да. Это в основном и очень заметно на сопоставленных сетевых ресурсах, потому что оно должно запрашивать каждый элемент. Путь кода одинаков для подключенных и обычных дисков.   -  person Innokenty    schedule 30.10.2010


Ответы (1)


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

Таким образом, возможно, что реализация платформы QFileIconProvider при некоторых обстоятельствах работает медленно на сетевых путях и, следовательно, замедляет основной поток пользовательского интерфейса.

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

person bjoern.bauer    schedule 31.10.2010