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

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

2)QFileSystemModel重写了sort

  1. void sort(int column, Qt::SortOrder order = Qt::AscendingOrder);
 

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

  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实现文件系统的文件名排序的更多相关文章

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

    前段时间,需要做一个功能是要做文件系统的排序的功能.由于是自己写的model, 自己定义的数据结构.最初的想法只有一个自己去实现文件夹跟文件名的排序算法,不过感觉比较费时间.后来想到的是QFileSy ...

  2. Qt自定义model

    前面我们说了Qt提供的几个预定义model.但是,面对变化万千的需求,那几个model是远远不能满足我们的需要的.另外,对于Qt这种框架来说,model的选择首先要能满足绝大多数功能的需要,这就是说, ...

  3. QT内省机制、自定义Model、数据库

    本文将介绍自定义Model过程中数据库数据源的获取方法,我使用过以下三种方式获取数据库数据源: 创建 存储对应数据库所有字段的 结构体,将结构体置于容器中返回,然后根据索引值(QModelIndex) ...

  4. iOS自定义model排序

    在开发过程中,可能需要按照model的某种属性排序. 1.自定义model @interface Person : NSObject @property (nonatomic,copy) NSStri ...

  5. Qt学习之路(45): 自定义model之一

    前面我们说了Qt提供的几个预定义model.但是,面对变化万千的需求,那几个model是远远不能满足我们的需要的.另外,对于Qt这种框架来说,model的选择首先要能满足绝大多数功能的需要,这就是说, ...

  6. Qt之如何自定义model

    Qt之如何自定义model https://blog.csdn.net/wei375653972/article/details/86592209

  7. Undo/Redo for Qt Tree Model

    Undo/Redo for Qt Tree Model eryar@163.com Abstract. Qt contains a set of item view classes that use ...

  8. 浅析在QtWidget中自定义Model

    Qt 4推出了一组新的item view类,它们使用model/view结构来管理数据与表示层的关系.这种结构带来的功能上的分离给了开发人员更大的弹性来定制数据项的表示,它也提供一个标准的model接 ...

  9. 浅析在QtWidget中自定义Model(beginInsertRows()和endInsertRows()是空架子,类似于一种信号,用来通知底层)

    Qt 4推出了一组新的item view类,它们使用model/view结构来管理数据与表示层的关系.这种结构带来的功能上的分离给了开发人员更大的弹性来定制数据项的表示,它也提供一个标准的model接 ...

随机推荐

  1. lrzsz on linux

    Linux Disibutaion:Ubuntu 16.04.1 LTS lrzsz是一款在linux里可代替ftp上传和下载的程序. 1.下载lrzsz源码包 #下载源码包 wget https:/ ...

  2. 使用SQLdiag Utility搜集SQL Server诊断信息

    SQLdiag Utility用于搜集诊断信息,给Microsoft技术支持人员做为判断依据. 使用SQLdiag 会进行信息搜集类型 Windows 系统性能日志 Windows 系统日志 SQL ...

  3. kettle中Get Data from XML , Jason Input , 文本文件输入 使用示例

    1.Get Data from XML xml文件内容: <head> <img id="1">菜||焦溜丸子||2013-03-28/image/0/00 ...

  4. 【转】代码高处走 从VC6到VC9移植代码问题说明

    首先可以直接用Visual Studio 2008的打开VC6的工作区文件和项目文件(dsw和dsp),并将其升级为VS2008的解决方案格式和项目格式(sln和vcproj),VC9的编译器相对于V ...

  5. 敌情篇 ——DDoS攻击原理

    敌情篇 ——DDoS攻击原理 DDoS攻击基础 DDoS(Distributed Denial of Service,分布式拒绝服务)攻击的主要目的是让指定目标无法提供正常服务,甚至从互联网上消失,是 ...

  6. iOS RunTime的简单使用

    1.根据指定规则根据runtime进行页面选择跳转 背景:要根据后台返回的数据 进行选择要跳转到哪一个ViewController // 这个规则肯定事先跟服务端沟通好,跳转对应的界面需要对应的参数 ...

  7. android 登陆案例_最终版本 sharedpreference

    xml  与之前的登陆案例相同 java代码: package com.itheima.login; import java.util.Map; import com.itheima.login.ut ...

  8. 导出Execel

    //请求入口 @SuppressWarnings("serial")@ParentPackage("default") //action请求@Results( ...

  9. 第36条:坚持使用Override注解

    @Override 注解只能用在方法声明中,表示被注解的方法声明覆盖了超类型中的一个声明. @Target(ElementType.METHOD) @Retention(RetentionPolicy ...

  10. DB2数据库中提高INSERT性能详解

        分类: Linux INSERT 处理过程概述 首先让我们快速地看看插入一行时的处理步骤.这些步骤中的每一步都有优化的潜力,对此我们在后面会一一讨论. 在客户机准备 语句.对于动态 SQL,在 ...