QSortFilterProxyModel 子类化排序研究

本例中重要包含qtablevie,MyModel(QAbstractTableModel的子类),mysortmodel(QSortFilterProxyModel)的子类。

触发排序的途径主要由一下几种:

1.点击QTableView的表头触发排序。

2.直接调用QTableView的函数进行排序:

void QTableView::sortByColumn(int column, Qt::SortOrder order)

3.调用QSortFiterProxyModel的函数进行排序:

virtual void sort(int column, Qt::SortOrder order = Qt::AscendingOrder) override

下面先从第一种方式说起:

1.点击QTableView的表头触发排序

点击表头的调用栈如下图所示:

点击表头之后的鼠标事件处理过程略,触发排序的过程主要是:

void QHeaderView::setSortIndicator(int logicalIndex, Qt::SortOrder order)
{
    。。。。。。
    emit sortIndicatorChanged(logicalIndex, order);

}

然后触发QTableView的Slot:

void QTableView::sortByColumn(int column)
{
    Q_D(QTableView);
    if (column == -1)
        return;
    d->model->sort(column, d->horizontalHeader->sortIndicatorOrder());
}

此函数中检查一下列是否未-1就直接调用model的sort函数,由于我们这里使用了代理类,因此就调用了代理类(QSortFiterProxyModel)的sort函数,下边我们看看代理类中的sort函数时怎么处理的。

void QSortFilterProxyModel::sort(int column, Qt::SortOrder order)
{
    Q_D(QSortFilterProxyModel);
    if (d->dynamic_sortfilter && d->proxy_sort_column == column && d->sort_order == order)
        return;
    d->sort_order = order;
    d->proxy_sort_column = column;
    d->update_source_sort_column();
    d->sort();
}

代理类中首先检查当前排序的行和排序方式(升序降序)是否跟上一次时一样的,如果时一样的就返回。

如果不一样,则保存这次排序的排序方式和行。

然后调用两个函数update_source_sort_column 和sort函数。

update_source_sort_column  这个函数比较复杂,主要是把数据model(此例中是MyModel)中行和列和代理Model(MySortModel)的行和列对应起来。因为使用代理类排序之后是不会改变数据model中的数据顺序的。

class QSortFilterProxyModelPrivate : public QAbstractProxyModelPrivate
{
    Q_DECLARE_PUBLIC(QSortFilterProxyModel)

public:
    struct Mapping {
 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QSortFilterProxyModel是Qt框架提供的一个用于排序和过滤的模型类。通过继承该类并重写相关方法,可以实现自定义的排序和过滤逻辑。 要实现排序功能,可以按照以下步骤进行操作: 1. 创建一个继承自QSortFilterProxyModel子类,比如命名为CustomSortFilterProxyModel。 2. 在子类的构造函数中设置排序标志,例如使用setSortRole()方法设置排序的角色。 3. 重写lessThan()方法,该方法用于比较两个项的排序值。在此方法中,可以根据需要使用data()方法获取项的数据,并进行比较。 4. 在需要排序的时候,调用子类的sort()方法,传入需要排序的列号和排序方式。 下面是一个示例代码: ```cpp class CustomSortFilterProxyModel : public QSortFilterProxyModel { public: CustomSortFilterProxyModel(QObject *parent = nullptr) : QSortFilterProxyModel(parent) { // 设置排序角色 setSortRole(Qt::DisplayRole); } protected: bool lessThan(const QModelIndex &left, const QModelIndex &right) const override { QVariant leftData = sourceModel()->data(left, sortRole()); QVariant rightData = sourceModel()->data(right, sortRole()); // 比较两个项的排序值 return leftData < rightData; } }; ``` 使用这个子类的示例: ```cpp QSortFilterProxyModel *proxyModel = new CustomSortFilterProxyModel(); proxyModel->setSourceModel(yourSourceModel); // 按第一列升序排序 proxyModel->sort(0, Qt::AscendingOrder); ``` 通过以上步骤,你可以实现使用QSortFilterProxyModel进行排序的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值