从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相比最大的改进有两点: 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")); |
联系客服