gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:56:31 24 4
gpt4 key购买 nike

我实现了自定义 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 来指示当前排序无效,即应该执行新的排序操作。

请注意,当 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();
}

关于C++ - 更改自定义 QSortFilterProxyModel 的排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46347275/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com