我的UI正在使用QTreeView和QFileSystemModel来选择文件夹和文件。 QFileSystemModel的文档说文件结构更新是在一个单独的线程上完成的,这意味着UI不会被阻止。但是,对我来说情况并非如此,我无法弄清楚这种差异以及其他人如何解决这个问题。在调试之后,我注意到大部分时间的QFileSystemModel _q_fileSystemChanged槽仍然在主UI线程上执行,这是有意义的。问题是文档如何声称它不会阻止UI。有解决方案吗?我误解了什么吗?
要复制 - 使用QFileSystemDataModel创建QTreeView - 将根路径设置为“”或“/” - 在QFileSystemModel _q_fileSystemChanged槽中设置断点 - 在应用加载后展开其中一个驱动器
问题: - 在UI线程上调用插槽,从而阻止应用程序直到完成。
有一些方法可以让文件解析器更快,但我真的需要在一个单独的线程上执行,并在填充数据并为QTreeView做好准备时通知。
谢谢, Innokenty
答案 0 :(得分:4)
我认为这可能是图标的原因。在_q_fileSystemChanged()
槽fileInfoGatherer.getInfo()
内被调用,其中 - 除其他外 - 解析路径的图标。在其当前设计中QFileIconProvider
使用QIcon
来表示图标,而QIcon
只能在UI线程中使用。 QImage
似乎是唯一允许在其他线程中使用的类,但我认为在后台线程中使用QImage
并将其转换为UI中的QIcon
可能会很昂贵线程。
因此,在某些情况下,QFileIconProvider
的平台实现可能在网络路径上很慢,因此会降低UI主线程的速度。
我不知道这是否是您问题的根源,但至少这应该是在UI线程中调用_q_fileSystemChanged()
的原因。