QSortFilterProxyModel 对多个列进行排序
QSortFilterProxyModel sort multiple columns
我正在尝试实现一个可在多列上排序的表。Qt的QSortFilterProxyModel仅支持对一列进行排序(至少在Qt 4.6.2中)。
我已经在 github 上找到了 dimkanovikov 的这个解决方案,但它缺乏对添加行的动态更新。我的意思是,模型被改变了,beginInsertRows(),beginRemoveRows(),它们相应的结束。-方法和 dataChanged() 信号被发出。理想情况下,我只想更新这些行,但模型至少应该对此类更改做出反应。
Qt网站上还有另一个FAQ项目,可以对QTableWidget进行排序,但它也缺乏动态更新。
我是Qt的新手,我想得到一些关于我应该如何去做的指示。
QSortFilterProxyModel
的排序角色设置为与默认Qt::DisplayRole
不同的setSortRole(Qt::UserRole)
。然后,在模型的data()
方法中,如果使用角色Qt::UserRole
调用它,则返回一个正确的排序键,例如通过连接所涉及的列的字符串。
有一个稍微不优雅的解决方案,它总是用于对多列进行排序。
您必须QSortFilterProxyModel
子类并重新实现bool lessThan(const QModelIndex &rLeft, const QModelIndex &rRight) const
。不要只比较两个给定的索引,而是检查所有列:
int const left_row = rLeft.row();
int const right_row = rRight.row();
int const num_columns = sourceModel()->columnCount();
for(int compared_column = rLeft.column(); compared_column<num_columns; ++compared_column) {
QModelIndex const left_idx = sourceModel()->index(left_row, compared_column, QModelIndex());
QModelIndex const right_idx = sourceModel()->index(right_row, compared_column, QModelIndex());
QString const leftData = sourceModel()->data(left_idx).toString();
QString const rightData = sourceModel()->data(right_idx).toString();
int const compare = QString::localeAwareCompare(leftData, rightData);
if(compare!=0) {
return compare<0;
}
}
return false;
然后,您可以在QSortFilterProxyModel
子类上调用sort(0)
,它将对所有列进行排序。此外,当您希望在模型数据更改时动态重新排序的行时,不要忘记调用setDynamicSortFilter(true)
。
若要支持按升序或降序对任意列进行排序,必须将此信息保留在QList
中,并在调用lessThan
时进行相应的比较。在列表中,您将按其优先级顺序排列列,并按相同的顺序进行比较。您还应该按某种预定义的顺序对其他"非活动"列进行排序,否则默认情况下不会对它们进行排序。
- 二叉排序树无法编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- C++选择排序算法中的逻辑错误
- 使用C++程序合并排序没有得到正确的输出
- 计算排序向量的向量中唯一值的计数
- 排序算法c++
- 使用2个键的cpp-stl::优先级队列排序不正确
- 将结构向量排序为子组
- 在c++中尝试对对象数组进行排序时,出现std:bad_alloc错误
- 如何对点云数据进行排序
- 对字符串进行排序时,在c++中处理sort()
- 是否有类似std::lower_bound的函数,而不需要排序/分区输入
- 下面是排序算法O(n)吗
- std::sort()函数无法对向量的一部分进行排序
- shell排序中的交换和比较
- clang格式:禁用排序包含
- 显示错误输出的简单数组排序程序
- 为什么我的排序算法会更改数组值
- 试图在c++中对数字列表进行排序
- 如何在C++中对数组进行冒泡排序