2

複数の列で並べ替え可能なテーブルを実装しようとしています。Qt の QSortFilterProxyModel は、1 つの列での並べ替えのみをサポートしています (少なくとも Qt 4.6.2 では)。

私はgithubでdimkanovikovによってこの解決策を見つけましたが、追加された行の動的更新が欠けています。つまり、モデルが変更され、beginInsertRows()、beginRemoveRows()、それらに対応する end..-methods、および dataChanged() シグナルが発行されます。理想的には、これらの行のみを更新したいのですが、モデルは少なくともそのような変更に反応する必要があります。

Qt のサイトには、QTableWidget をソートする別の FAQ 項目がありますが、動的更新もありません。

私は Qt を初めて使用するので、これをどのように行うべきかについていくつかの指針を得たいと思います。

4

2 に答える 2

7

の並べ替えの役割を、デフォルトの。とQSortFilterProxyModelは異なるものに設定できます。次に、モデルのメソッドで、関連する列の文字列を連結するなどして、ロールで呼び出された場合に適切な並べ替えキーを返します。Qt::DisplayRolesetSortRole(Qt::UserRole)data()Qt::UserRole

于 2012-08-06T21:01:40.260 に答える
7

複数の列を並べ替えるために常に使用される、少し洗練されていない解決策が 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リストでは、列を優先度順に並べて、同じ順序で比較を行います。また、他の「非アクティブ」列を事前定義された順序でソートする必要があります。そうしないと、デフォルトでソートされません。

于 2012-06-27T08:24:28.937 に答える