我已经实现了一个自定义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还很新,而且文档有点压倒性,也许有人可以指出我正确的方向?
答案 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(); }