我已经实现了自定义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
}
}
并让我的switch sort函数执行以下操作:
void MyProxyModel::switchSort(bool b)
{
sort_by_priority = b;
sort(0, Qt::AscendingOrder);
}
但这并没有做任何事情(调用此函数后什么都不会重新排序),因此显然这不是正确的方法。 (是的,启用了setDynamicSortFilter)
我通过创建两个代理模型来解决此问题,一个代理模型按优先级排序,另一个按名称排序,而我只是在两者之间切换。但是我意识到这是一个非常微不足道的解决方案,并且必须有一些简单得多的方法。但是由于我对Qt还是很陌生,并且文档太过庞大,也许有人可以为我指明正确的方向?
最佳答案
您应该调用QSortFilterProxyModel::invalidate
来指示当前排序无效,即应执行新的排序操作。
请注意,当sort
为false或您指定了其他列或顺序时(在代码中可以看到),显式调用dynamicSortFilter
也将有效: