【问题标题】:QT: QFileSystemModel _q_fileSystemChanged slot is executed on the UI thread which contradicts documentationQT:QFileSystemModel _q_fileSystemChanged 插槽在与文档相矛盾的 UI 线程上执行
【发布时间】:2011-05-02 15:03:30
【问题描述】:

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

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

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

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

谢谢, 天真无邪

【问题讨论】:

  • 在不使用断点调试时,您的应用程序是否真的死机了?
  • 是的。它在映射的网络共享上非常明显,因为它必须查询每个项目。映射驱动器和常规驱动器的代码路径相同。

标签: multithreading qt user-interface qtreeview qfilesystemmodel


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-07-22
    • 1970-01-01
    • 2018-09-04
    • 2017-07-04
    • 1970-01-01
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多