您当前的位置: 首页 > 

龚建波

暂无认证

  • 3浏览

    0关注

    313博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

QAbstractTableModel基本使用:排序相关接口

龚建波 发布时间:2020-09-19 00:35:54 ,浏览量:3

前言

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            
关注
打赏
1655829268
查看更多评论
0.0762s