Qt中MVC的M(Model)

Qt中MVC的M(Model)简单介绍

Qt有自己的MVC框架,分别是model(模型)、view(视图)、delegate(委托),这篇文章,简单的介绍以下Qt中有关model(模型)的类以及一些基本的使用。
Qt官方的文档已经很详细了,如果想要详细的去了解,建议花点精力去看官方文档。

类继承的结构

Qt中的模型类,都继承自QAbstractItemModel,这个类定义了基本的必须的接口。


由于QAbstractItemModel这种带有abstract的类是抽象类,不建议直接使用,所以本文只介绍可直接使用的类的基本用法。

QStringListModel

根据Qt帮助文档中的解释,QStringListModel是一个可编辑的模型,可用于需要在视图小部件(如QListView或QComboBox)中显示许多字符串的简单情况。
下面是使用的代码以及效果展示:

QStringListModel *m_listModel_2 = new QStringListModel;
QStringList list_2  = {"111", "222", "333", "444", "555"};
m_listModel_2->setStringList(list_2);

ui->listView->setModel(m_listModel_2);

展现的效果:

QAbstractProxyModel

这里有一个Proxy(代理),这个要和Delegate(委托)区分开来。我的理解是,Proxy(代理)主要是应用在model上,用于对原数据进行处理,而Delegate(委托)主要是用来显示和编辑数据。
为什么要有这个代理呢?个人理解是,当Model关联了几个View时,如果你需要对某一个Model的数据进行排序,那如果不用代理,那么就意味着你原本的Model也会改变,那么所有的View都会改变。那么如果你仅仅只需要当前的view对这个数据进行改变,那么就需要用到代理,帮你把内容进行一个处理,然后发出来。
 

本文福利,莬费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT界面开发-图像绘制,QT网络,QT数据库编程,QT项目实战,QSS,OpenCV,Quick模块,面试题等等)↓↓↓↓↓↓见下面↓↓文章底部点击莬费领取↓↓

QSortFilterProxyModel

这个代理,提供了排序和过滤的接口,能够方便的调用,给数据提供一个排序过滤的功能;
根据Qt官方帮助文档对于QSortFilterProxyModel的介绍:

QSortFilterProxyModel can be used for sorting items, filtering out items, or both. The model transforms the structure of a source model by mapping the model indexes it supplies to new indexes, corresponding to different locations, for views to use. This approach allows a given source model to be restructured as far as views are concerned without requiring any transformations on the underlying data, and without duplicating the data in memory.


QSortFilterProxyModel 可用于排序项目、过滤项目或两者兼而有之。 该模型通过将其提供的模型索引映射到新索引(对应于不同位置)来转换源模型的结构,以供视图使用。 这种方法允许就视图而言对给定的源模型进行重构,而无需对基础数据进行任何转换,也无需复制内存中的数据。

以下是基本的用法:

  1. 排序
QTableView* tableview = new QTableView();

QStandardItemModel *model = new QStandardItemModel();
model->setItem(0, 0, new QStandardItem("Aba"));
model->setItem(1, 0, new QStandardItem("aba"));
model->setItem(2, 0, new QStandardItem("ABc"));
model->setItem(0, 1, new QStandardItem("C"));
model->setItem(1, 1, new QStandardItem("A"));
model->setItem(2, 1, new QStandardItem("c"));
model->setItem(0, 2, new QStandardItem("c"));
model->setItem(1, 2, new QStandardItem("b"));
model->setItem(2, 2, new QStandardItem("C"));

QSortFilterProxyModel* sortFilterModel = new QSortFilterProxyModel();
// 为代理设置源model
sortFilterModel->setSourceModel(listModel);
// 设置大小写敏感
sortFilterModel->setSortCaseSensitivity();

tableview->setModel(sortFilterModel);
// 设置开启点击表头进行排序
tableview->setSortingEnable(true);

需注意的是,当你使用QTableView或者QTreeView时,调用setSortingEnable并设置为true,就可以设置点击表头进行排序。

当然,你可以手动进行排序

// 对第二列进行升序排序
ui->tableview->sortByColumn(1, Qt::AscendingOrder);

但是这样排序有一个问题:表的序号没有进行改变。暂时没有找到方法来解决,有一个参考的解决方法可以看:QTableView自定义Model实现排序 。同样,如果你要自定义排序的规则的话,你可以继承QSortFilterProxyModel类,然后重写lessThan函数,重新写一下里面的排序规则。可以参考Qt官方的例子Custom Sort/Filter Model

2.过滤

过滤的规则你可以选择

  • 正则表达式
  • 通配符模式
  • 固定字符串


在层级结构中,会递归的去过滤其子节点。同时,当父节点被过滤时,子节点也不会被显示。
基本用法如下:


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值