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();
}
我实现了自定义 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(); }