现在的位置: 首页 > 综合 > 正文

通过QtMVC实现视图数据分离与数据的排序及过滤显示

2012年07月01日 ⁄ 综合 ⁄ 共 5788字 ⁄ 字号 评论关闭

首先,不叙述有关MVC的任何常识。其次,不讨论关于Qt实现的MVC机制的优劣。

 

下面谈谈需求:

 

1. 显示指定类型的数据信息

2. 支持数据分不同类型显示(即,属性过滤)

3. 支持数据按名称检索(即,名称正则表达式过滤)

4. 支持对显示的数据按指定规则进行排序(即,支持按多种属性排序)

 

呵,貌似有些抽象。那就定义一个结构吧:

 

只需要表达流程即可,具体属性语义可不必深究。

 

下面,给出数据类型枚举:

 

 

然后,定义过滤类型枚举:

 

 

于是,问题就可以重新解释如下:

 

要显示一stTestData列表,并且可以根据需求只显示指定类型(比如,场景/模型或粒子系统等)的数据。(不仅如此,我们还可以给出一个输入框。让用户输入关键字进行名称检索。)对于当前显示的数据,用户可以指定排序方式(即,按名称排序/按时间排序或按大小排序)。

 

基本上就是这个样子了。下面列出需要使用的Qt相关类:

 

QAbstractListModel,保存按列表显示的数据模型

QSortFilterProxyModel,对数据模型进行过滤和排序的中间代理模型

QListView,用来显示数据的视图

 

三者之间的关系是,实现一个QAbstractListModel的子类存储我们所有的stTestData数据。它负责数据的增删等最基本的存储管理。

然后,实现一个QSortFilterProxyModel的子类来对QAbstractListModel中的数据进行过滤和排序。最后,将代理模型中的数据提交给QListView去显示和操作。

 

具体用法比较简单,QAssistant上都有。不行还有源码呢。

 

流程上有几个关键函数需要重写,相关代码如下:

 

TestDataSortFilterModel.h

 

TestDataSortFilterModel.cpp

 

 

TestDataModel.h

 

 

TestDataModel.cpp

 

 

使用也很简单:

 

 

以下有几点需要注意:

 

1. Qt在MVC框架中进行数据操作都是针对QVariant进行的,所以自己的类型也需要包装成一个QVariant

    Q_DECLARE_METATYPE(stTestData) //如此即可

2. Qt在对模型里数据进行操作(访问和存储)时,数据都有各自的职责描述的,比如DisplayRole用来显示,ToolTipRole是提示文字,EditRole用来编辑,甚至前景色背景色都是有Role定义的。为了支持我们自己的数据读写,我们也需要给他设定个用途,一切从Qt::UserRole开始。enUserRole_TestDataRole = Qt::UserRole 如此即可。

3. 以上只对单一类型进行了显示控制,要想同时显示多种类型,扩展一下即可。

4. QListView居然没有setSortingEnabled这个函数(QTreeView有~_~),好吧,每次需要重新排序的时候,自己手动sort一下即可。

 

下面贴几张效果图:

 

只显示模型分类:

 

只显示模型分类

 

显示所有:

 

显示所有

 

显示所有按大小排序(此处大小用的是名字长度):

 

显示所有按大小排序

 

 

在所有类型中进行名称过滤显示:

 

按名称过滤

 

 

源代码下载

抱歉!评论已关闭.