QT:QFileSystemModel _q_fileSystemChanged插槽在UI线程上执行,与文档相矛盾

时间:2010-10-29 20:39:00

标签: multithreading qt user-interface qtreeview qfilesystemmodel

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

要复制   - 使用QFileSystemDataModel创建QTreeView   - 将根路径设置为“”或“/”   - 在QFileSystemModel _q_fileSystemChanged槽中设置断点   - 在应用加载后展开其中一个驱动器

问题:   - 在UI线程上调用插槽,从而阻止应用程序直到完成。

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

谢谢, Innokenty

1 个答案:

答案 0 :(得分:4)

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

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

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