QAbstractTableModel 继承自 QAbstractItemModel,主要用于为 QTableView 提供相关接口,我们可以子类化该抽象类并实现相关接口。本文主要讲 QAbstractTableModel 提供的 sort 接口的相关细节。
(请确保自己已经熟悉了 rowCount、columnCount、data 等基础的接口)
使用 QTableView 的排序功能QTableView 有个 setSortingEnabled 接口,设置为 true 后,我们就可以通过点击表头根据某一列的数据进行排序,支持升序和降序。
点击表头排序的时候,最终回调的就是 model 的 sort 接口,该接口的默认实现是空的,所以我们只开启 view 的排序还不能完成这个功能。有两种方式可以实现排序:
第一是使用 QSortFilterProxyModel ,该接口提供了排序的默认实现,如果要自定义排序规则可以重新实现其 lessThan 接口。使用它的好处是 reset model 数据后排序依然有效。不方便的是他的排序只是改变了单元格的显示位置索引,数据其实是没有修改顺序的,这就导致排序后行号就还是原来的行号。
第二是自定义实现 model 的 sort 接口。好处是排序后直接修改的原始数据,行号是正常的升序。坏处是 reset model 后不会自动排序,需要做信号槽的关联来完成,或者加载数据时处理下;而且修改了原始数据就不能恢复未排序的状态了,我们想要恢复还得在初始加载数据的时候保留这个索引在每一行的数据里,这样在恢复默认顺序的时候根据这个索引排序。
QTableView *table=ui->tableView;
model=new MyTableModel(ui->tableView);
//想要利用view支持的点击表头排序功能
//我们可以用QSortFilterProxyModel完成排序,或者实现model的sort接口来完成排序
//其次,view要设置setSortingEnabled为true,且表头是可点击的
#if 0
//借助QSortFilterProxyModel
QSortFilterProxyModel *proxy=new QSortFilterProxyModel(ui->tableView);
proxy->setSourceModel(model);
table->setModel(proxy);
#else
//借助model的sort接口,基类实现不执行任何操作,要自己实现
table->setModel(model);
#endif
实现 sort 接口
参照 QSortFilterProxyModel 的 sort 实现,我完成了一个简易的 sort 接口实现:
void MyTableModel::sort(int column, Qt::SortOrder order)
{
if(modelData.isEmpty()||column=columnCount())
return;
//判断升序降序
const bool is_asc = (order == Qt::AscendingOrder);
//排序
std::sort(modelData.begin(), modelData.end(),
[column, is_asc, this](const MyModelItem &left,const MyModelItem &right){
//我用QVariant只是在以前的基础上改的,自定义类型可以不用这个
//这里假设单元格数据都是任意类型的
const QVariant left_val = left.at(column);
const QVariant right_val = right.at(column);
//辅助接口,a
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?