複数の列を並べ替えるために常に使用される、少し洗練されていない解決策が 1 つあります。
サブクラス化QSortFilterProxyModel
して再実装する必要がありbool lessThan(const QModelIndex &rLeft, const QModelIndex &rRight) const
ます。与えられた 2 つのインデックスを比較するだけでなく、すべての列をチェックします。
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)
また、モデル データが変更されたときに、並べ替えられた行を動的に並べ替えたい場合は、忘れずに呼び出してください。
昇順または降順での任意の列の並べ替えをサポートするには、この情報を に保持し、が呼び出されたQList
ときにそれに応じて比較する必要があります。lessThan
リストでは、列を優先度順に並べて、同じ順序で比較を行います。また、他の「非アクティブ」列を事前定義された順序でソートする必要があります。そうしないと、デフォルトでソートされません。