stevenyao

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  22 随笔 :: 1 文章 :: 67 评论 :: 0 Trackbacks
这两个类的功能很相似,都是从 QAbstractItemModel 的派生的,都可以和 任何 ItemView类配合使用。

但是 QT 没理由提供两个一模一样的类,对吧。

最重要的区别是,QFileSystemModel是拥有独立线程的,对于文件目录的获取也是异步方式的。

比如,当你创建了 QFileSystemModel的对象,并且setRootPath后,rowCount返回值依然是 0,因为枚举目录的操作是异步的可能还没开始呢,这点和QDirModel不一样。

实际上,当你构建好了一个 QFileSystemModel后,一个thread也同时被创建了,这就是 QFileSystemModel的一个私有成员变量,fileInfoGatherer

这个对象的类型实际上是 QThread的派生类,所以它其实代表了一个线程。

通过调用 fileInfoGatherer->list(...) 给这个线程发送枚举目录的请求,当线程完成工作后,在通过一系列 xxx_change 信号通知QFileSystemModel。

当Model发现目录数据有变化的时候 再通过一些Model的信号通知它所在的ItemView,从而完成这个异步的目录枚举过程。

使用 QFileSystemModel的好处是很明显的,可以避免在目录下文件太多的时候 UI发生卡死现象,同样如果枚举的目录来自远程,比如网络目录,也可以减少UI的阻塞。

另外,还有一个好处就是 QFileSystemModel内置了对目录变化的监视,这是通过 QFileSystemWatcher 类来实现的,所以用QFileSystemModel就不用担心目录文件变化了,当有变化发生ItemView自然会收到更新的信号。

此外,以上这些都已经完全移植到了Symbian。

posted on 2009-12-03 22:15 姚冬 阅读(5832) 评论(1)  编辑 收藏 引用

评论

# re: QFileSystemModel 和 QDirModel的区别. 2010-01-20 14:40 dark
谢谢~

看文档照做,正纳闷为什么rowCount返回0 呢~  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理