有一个稍微不优雅的解决方案,它总是用于对多列进行排序。
您必须继承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;
然后你可以调用sort(0)
你的QSortFilterProxyModel
子类,它会对所有的列进行排序。setDynamicSortFilter(true)
当您希望在模型数据更改时动态地重新排序已排序的行时,也不要忘记调用。
要支持按升序或降序对任意列进行排序,您必须将此信息保存在 a 中并在调用QList
时进行相应的比较。lessThan
在列表中,您将按优先级顺序排列列,并按相同顺序进行比较。您还应该以某种预定义的顺序对其他“非活动”列进行排序,否则默认情况下不会对它们进行排序。