有人做过文件管理器吗,QFileSystemModel怎么添加自定义数据管理器的一列

用QFileSystemModel实现简单的文件浏览程序
今天我们从一个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 QTreeV
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 QListV
layout-&addWidget(lv);
lv-&setModel(model);
lv-&setRootIndex(model-&setRootPath("/home/cuteqt"));
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。1716人阅读
前段时间,需要做一个功能是要做文件系统的排序的功能。由于是自己写的model, 自己定义的数据结构。最初的想法只有一个自己去实现文件夹跟文件名的排序算法,不过感觉比较费时间。后来想到的是QFileSystemModel就是Qt标准的文件系统的model,可以把里面关于排序的算法提出来,没有必要重复造轮子。看了一下QFileSystemModel的源码,找到的排序算法如下(主要单元在qfilesystemmodel.cpp):
& 1)文件系统的文件名排序主要涉及到文件夹跟文件的顺序(文件夹要排在文件前),文件大小的排序,文件类型,修改时间的排序
& 2)QFileSystemModel重写了sortvoid sort(int column, Qt::SortOrder order = Qt::AscendingOrder);
& 里面首先通过一个QList&QPair&QFileSystemModelPrivate::QFileSystemNode*,&int&&&把所有的结点取出来的,然后调用
d-&sortChildren(column, index(rootPath()));
&& 对取出来的数据进行排序,sortChildren里对是否属于当前路径的子进行过滤。然后调用QFileSystemModelSorter对里面的结点进行排序。调用的是stl 的std:sort,排序的算法调用的QFileSystemModelSorter的。这里的算法可以整个提出来。算法的细节就没有再继续下去了。
& 3)自己实现的model可以同样参考这样的流程:重写sort文件,把当前路径的子提出来了,然后调用QFileSystemModelSorter的排序算法进行排序,将排序出来的结点,重新构造新的结点给model就可以了。
& Qt源码里还有很多东西值得借鉴的,是一个大宝库。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:30968次
排名:千里之外
原创:14篇
(1)(1)(1)(1)(1)(1)(1)(2)(1)(1)(1)(2)匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 re文件管理器 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信