这两个类的功能很相似,都是从 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。