【问题标题】:Qt Asynchronous Display with Asynchronous QFileSystemModelQt 异步显示与异步 QFileSystemModel
【发布时间】:2014-08-15 13:50:51
【问题描述】:

我正在尝试实现自定义文件资源管理器,该资源管理器获取特定(内部文件系统)文件的元数据并将所有这些数据与文件一起显示。对于这个任务,我已经实现了自定义 QFileSystemModel 来处理这个问题。

现在,我知道 QFileSystemModel 中文件的加载是异步的,但显示不是。 Qt 保持显示作业,直到所有文件都加载完毕。由于我在每个显示调用中都包含了元数据提取逻辑,因此它使包含 100 多个文件的文件夹的显示速度非常慢(即使在缓存之后)。在整个这段时间内,显示被完全屏蔽。如何异步显示结果。准确地说是部分显示列表,然后在有更新时刷新它。

文件通过 QTableView UI 小部件显示。

【问题讨论】:

    标签: qt qtreeview qfilesystemmodel


    【解决方案1】:

    1.您可以将提取逻辑放在不同的线程中。看这里怎么做:http://mayaposch.wordpress.com/2011/11/01/how-to-really-truly-use-qthreads-the-full-explanation/
    如果您使用共享数据,请不要忘记使用互斥锁。您还可以通过带有包含元信息的参数的信号将新线程中的新元发送到 GUI。这样,您需要使用 qRegisterMetaTypeQ_DECLARE_METATYPE 注册一个新类,以便将其转换为 QVariant 并返回:
    http://qt-project.org/doc/qt-4.8/qmetatype.html

    2.此外,如果您禁用图标加载,您可以加快文件加载速度。例如,如果您只有一种类型的文件,您可以提供从资源中预加载的图标。
    这是禁用图标加载的方法:

    a) 创建一个虚假的图标提供者:

    class FakeIconProvider : public QFileIconProvider
    {
    public:
      FakeIconProvider();
      virtual QIcon icon(IconType) const override
      {
         return QIcon();
      }
      virtual QIcon icon(const QFileInfo&) const override
      {
         return QIcon();
      }
    };
    

    b) 创建假图标提供程序的实例并将其安装到模型中:

     model->setIconProvider(m_fakeIconProvider);
    

    【讨论】:

    • 好的。你的想法真的很棒。我实现了它,它确实有效,但我已经准备好在列中打印元数据了。但我不知道为什么,我很难在列中显示该数据。我在自定义 QFileSystemModel 方法中使用元数据捕获了事件,该方法调用 setData(QVariant, Index, Role ) 和重置视图。这没用。任何帮助
    • 如果您没有重新实现它,则不应使用setData,因为QFileSystemModel::setData 实际上重命名文件,这在您的情况下是错误的行为。相反,您需要将元数据存储在某处和emit dataChanged(...)。还重新实现模型的data 方法并提供如下内容:if (role == Qt::DisplayRole) return QFileSystemModel::data(index, role) + metadata(index);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 2015-02-23
    • 2012-11-03
    相关资源
    最近更新 更多