C++ - 更改自定义 QSortFilterProxyModel 的排序

C++ - Changing the sorting for custom 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 还是很陌生,而且文档有点多,也许有人能给我指明正确的方向?

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

请注意,当 dynamicSortFilter 为 false 或您指定另一列或顺序时,显式调用 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();
}