我的 UI 使用 QTreeView 和 QFileSystemModel 来选择文件夹和文件。 QFileSystemModel 的文档说文件结构更新是在单独的线程上完成的,这意味着 UI 不会被阻塞。然而,对我来说情况并非如此,我无法弄清楚其中的差异以及其他人如何没有遇到这个问题。调试后,我注意到 QFileSystemModel _q_fileSystemChanged 槽占用大部分时间仍然在主 UI 线程上执行,这是有意义的。问题是文档如何声称它不会阻塞 UI。有解决办法吗?我误解了什么吗?
重现
- 使用 QFileSystemDataModel 创建 QTreeView
- 将根路径设置为“”或“/”
- 在 QFileSystemModel _q_fileSystemChanged 槽中设置断点
- 应用程序加载后扩展驱动器之一
问题:
- 该槽在 UI 线程上调用,从而阻塞应用程序直到完成。
有多种方法可以使文件解析器更快,但我确实需要在单独的线程上执行,并在数据填充并准备好用于 QTreeView 时发出通知。
谢谢,
因诺肯蒂
我认为造成这种情况的原因可能是图标。内_q_fileSystemChanged()
slot fileInfoGatherer.getInfo()
被调用,其中 - 除其他外 - 解析路径的图标。在目前的设计中QFileIconProvider
uses QIcon
代表图标和QIcon
只能在UI线程中使用。QImage
似乎是唯一允许在其他线程中使用的类,但我认为使用它可能太昂贵QImage
在后台线程中并将其转换为QIcon
在 UI 线程中。
所以平台实现有可能QFileIconProvider
在某些情况下,网络路径速度较慢,因此会减慢 UI 主线程的速度。
我不知道这是否是您问题的根源,但至少这应该是原因_q_fileSystemChanged()
在 UI 线程内调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)