打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
QFileSystemModel
QFileSystemModel
2012-02-03 16:59

从QAbstractItemModel继承

成员:

     信号--rootPathChanged/fileRenamed

     函数 index/hasChildren/canFetchMore/FetchMore/

             rowCount/columnCount

             data  决定了每一列显示的内容(name /size/type/date),图标,对齐方式等

             setData

             headerData

 

与QFileSystemModelPrivate的关系?

 

 

 QFileSystemModel 和 QDirModel的区别.

http://www.cppblog.com/stevenyao/archive/2009/12/03/102495.aspx

QFileSystemModel是拥有独立线程的,对于文件目录的获取也是异步方式的

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

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

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

QFileSystemModel内置了对目录变化的监视,这是通过 QFileSystemWatcher 类来实现的

 

今天我们从一个itemview的例子开始。 我们通常会在Qt例子中寻找我们需要的功能, 再以阅读源码的方式寻找解决问题的方法。如果你碰巧想要写一个资源管理器之类的东西, 肯定会注意到Qt带的名为dirview的例子。这个例子用QTreeView和QDirModel实现了一个简单的浏览文件的程序,该程序简单到让人咋舌的地步, 仅仅一个源码文件, 仅仅不到20行的代码, OMG,如果所有的程序都能这么容易写就好了!(当然我们作为程序员如果冒出了这样的想法那是完全完全错误的, 别忘了我们还指着这个吃饭呢,要是代码都这么简单凭啥人家还给咱工资干这个阿~)

不过这个程序有个不太明显的问题, 有可能你还没有注意到。 在你打开一些目录的时候, 可能会有一瞬间的界面停顿,比如当你要打开的目录文件巨多, 或者是打开网络目录而网络响应的不是那么快的时候。 这是因为QDirModel这个类实现的非常“正规”,没有过多考虑某些极限的情况, 鉴于这个类确实有这样的小缺陷, 另外还鉴于此类的名称太不称头,在4.4版本Qt又引入了一个新的Model类完成类似的功能, 但提供更好的实现和更好用的API,这个类就是我们今天要说的QFileSystemModel.

根据文档的说明QFileSystemModel类和QDirModel提供相同的基本功能, 就是提供本地文件系统数据(目录、文件等),但其与QDirModel相比最大的改进有两点:
1、 单开一个线程获取数据, 不会阻塞gui线程
2、 文件系统数据发生改变时Model会自动更新

这两个新功能都是非常吸引人的, 更别说两个类都支持的诸如改名、创建目录、删除目录等功能了。
用它来做标准的文件系统目录浏览像dirview的例子一样, 寥寥几行就能完成:

 QVBoxLayout* layout = new QVBoxLayout(this); QFileSystemModel* model = new QFileSystemModel(this); model->setFilter(QDir::AllEntries | QDir::NoDotAndDotDot); model->setRootPath("/"); QTreeView* tv = new QTreeView; tv->setModel(model); layout->addWidget(tv);

上面的代码中的setRootPath是个比较特别的函数, 按照笔者的理解它的功能是通知Model去监控该目录的变化,并且开始获取数据。 在调用此函数之前, Model并不去读取文件系统的结构,所以界面的显示可能是错误的。  设置了该路径之后, QFileSystemModel会开启一个QFileSystemWatcher监控该目录的变化,并及时更新数据。  这个函数会返回当前rootitem的index。 但需要注意的是,可能和多数人想象的不同, 这个函数并不表示会改变当前view以设置的路径为根路径…所以,如果你想实现这个功能需要用到setRootPath的返回值,调用QAbstractItemView的方法setRootIndex就可以了 --这样的功能经常在手机版的文件管理器中出现(如List视图模式下)。

代码如下所示:

 QVBoxLayout* layout = new QVBoxLayout(this); QFileSystemModel* model = new QFileSystemModel(this); model->setFilter(QDir::AllEntries | QDir::NoDotAndDotDot); QListView* lv = new QListView; layout->addWidget(lv); lv->setModel(model);
 lv->setRootIndex(model->setRootPath("/home/cuteqt"));

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
【Qt】之 QTreeView和QFileSystemModel
qt做文件浏览器
QListView,QTreeView和 QStandardItemModel的简单使用
QTreeView开发实例(有改动)
Qt 学习之路 2(45):模型 | DevBean Tech World
QT小案例——文件系统
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服