C ++ - 更改自定义QSortFilterProxyModel

时间:2017-09-21 14:59:51

标签: c++ qt sorting qstandarditemmodel qsortfilterproxymodel

我已经实现了一个自定义QSortFilterProxyModel来排序QStandardItemModel。我已经覆盖了lessThan()函数,因为我需要根据多个角色对其进行排序,而不仅仅是单个角色。例如,我按优先级值对条目进行排序,具有相同优先级的条目进一步按其时间戳排序。

现在,如果我想按其他值排序,例如按字母顺序排列名称值,该怎么办?

我认为我可以通过简单地在lessThan函数中分离不同的情况来实现这一点:

bool MyProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const
{
    if (sorting_by_priority)
    {
        // compare priority roles
    }
    else
    {
        // compare name roles
    }
}

让我的开关排序功能做这样的事情:

void MyProxyModel::switchSort(bool b)
{
    sort_by_priority = b;
    sort(0, Qt::AscendingOrder);
}

但是这并没有做任何事情(在调用这个函数后没有重新排序),所以显然这不是正确的方法。 (是的,启用了setDynamicSortFilter)

我通过创建两个代理模型来解决这个问题,一个按优先级排序,另一个按名称排序,我只是在两者之间切换。但我意识到这是一个非常不优雅的解决方案,必须有一些更简单的东西。但是,由于我对Qt还很新,而且文档有点压倒性,也许有人可以指出我正确的方向?

1 个答案:

答案 0 :(得分:0)

您应该调用QSortFilterProxyModel::invalidate以指示当前排序无效,即应执行新的排序操作。

请注意,当sort为false或您指定其他列或订单时,显式调用dynamicSortFilter也会有效:

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();
}