使用异步QFileSystemModel进行Qt异步显示

时间:2014-08-15 03:59:42

标签: qt qtreeview qfilesystemmodel

我正在尝试实现自定义文件资源管理器,它可以获取特定(内部文件系统)文件的元数据,并显示所有这些数据以及文件。为此,我已经实现了自定义QFileSystemModel来处理这个问题。

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

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

1 个答案:

答案 0 :(得分:0)

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);