Qt 自定义model实现文件系统的文件名排序(重定义sort函数即可。忽然开窍了:其实捕捉点击Header事件,内部重排序,全部刷新显示即可)

Posted 朝闻道

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt 自定义model实现文件系统的文件名排序(重定义sort函数即可。忽然开窍了:其实捕捉点击Header事件,内部重排序,全部刷新显示即可)相关的知识,希望对你有一定的参考价值。

 前段时间,需要做一个功能是要做文件系统的排序的功能。由于是自己写的model, 自己定义的数据结构。最初的想法只有一个自己去实现文件夹跟文件名的排序算法,不过感觉比较费时间。后来想到的是QFileSystemModel就是Qt标准的文件系统的model,可以把里面关于排序的算法提出来,没有必要重复造轮子。看了一下QFileSystemModel的源码,找到的排序算法如下(主要单元在qfilesystemmodel.cpp):

  1)文件系统的文件名排序主要涉及到文件夹跟文件的顺序(文件夹要排在文件前),文件大小的排序,文件类型,修改时间的排序

  2)QFileSystemModel重写了sort

[cpp] view plain copy
 
 技术分享技术分享
  1. void sort(int column, Qt::SortOrder order = Qt::AscendingOrder);  

 

 

  里面首先通过一个QList<QPair<QFileSystemModelPrivate::QFileSystemNode*, int> >把所有的结点取出来的,然后调用

[cpp] view plain copy
 
 技术分享技术分享
  1. d->sortChildren(column, index(rootPath()));   


   对取出来的数据进行排序,sortChildren里对是否属于当前路径的子进行过滤。然后调用QFileSystemModelSorter对里面的结点进行排序。调用的是stl 的std:sort,排序的算法调用的QFileSystemModelSorter的。这里的算法可以整个提出来。算法的细节就没有再继续下去了。

  3)自己实现的model可以同样参考这样的流程:重写sort文件,把当前路径的子提出来了,然后调用QFileSystemModelSorter的排序算法进行排序,将排序出来的结点,重新构造新的结点给model就可以了。
  Qt源码里还有很多东西值得借鉴的,是一个大宝库。

http://blog.csdn.net/hpjx1987/article/details/39753863

以上是关于Qt 自定义model实现文件系统的文件名排序(重定义sort函数即可。忽然开窍了:其实捕捉点击Header事件,内部重排序,全部刷新显示即可)的主要内容,如果未能解决你的问题,请参考以下文章

Qt实现系统桌面目录下文件搜索的GUI:功能一:文件查找与现实(下)

QT如何实现自定义下拉列表

QML中使用自定义Model和SortFilterProxyModel实现搜索

QML中使用自定义Model和SortFilterProxyModel实现搜索

windows7怎么自定义文件夹

QT实现自定义窗口