4

我的 UI 使用 QTreeView 和 QFileSystemModel 来选择文件夹和文件。QFileSystemModel 的文档说文件结构更新是在单独的线程上完成的,这意味着 UI 不会被阻塞。但是,对我来说不是这种情况,我无法弄清楚差异以及其他人如何没有遇到这个问题。调试后,我注意到占用大部分时间的 QFileSystemModel _q_fileSystemChanged 插槽仍然在主 UI 线程上执行,这是有道理的。问题g是文档如何声称它不会阻止用户界面。有解决办法吗?我是不是误会了什么?

重现 - 使用 QFileSystemDataModel 创建 QTreeView - 将根路径设置为“”或“/” - 在 QFileSystemModel _q_fileSystemChanged 插槽中设置断点 - 在应用程序加载后展开驱动器之一

问题: - 在 UI 线程上调用插槽,因此阻塞应用程序直到它完成。

有一些方法可以使文件解析器更快,但我真的需要在单独的线程上执行并在数据填充并准备好 QTreeView 时通知。

谢谢, Innokenty

4

1 回答 1

4

我认为原因可能是图标。在_q_fileSystemChanged()插槽内fileInfoGatherer.getInfo()被调用 - 除其他外 - 解析路径的图标。在它的当前设计中QFileIconProvider用于QIcon表示图标并且QIcon只能在 UI 线程中使用。QImage似乎是唯一允许在其他线程中使用的类,但我认为QImage在后台线程中使用并将其转换为QIconUI 线程中的可能会很昂贵。

因此,QFileIconProvider在某些情况下,平台实现可能在网络路径上很慢,因此会减慢 UI 主线程。

我不知道这是否是您问题的根源,但至少这应该是_q_fileSystemChanged()在 UI 线程中调用的原因。

于 2010-10-31T09:48:00.153 回答