2017-09-21 35 views
1

QStandardItemModelをソートするためのカスタムQSortFilterProxyModelを実装しました。私はlessThan()関数を上書きしました。なぜなら、単一の役割だけでなく、複数の役割に基づいてソートする必要があるからです。たとえば、エントリを優先度値でソートしています。同じ優先度を持つエントリは、タイムスタンプでさらにソートされます。C++ - カスタムQSortFilterProxyModelのソートの変更

ここで、名前の値をアルファベット順に並べ替える場合はどうすればよいですか?

私は単にlessThan機能で異なるケースを分離することによって、これを達成できると思っていた:

bool MyProxyModel::lessThan(const QModelIndex &left, const QModelIndex &right) const 
{ 
    if (sorting_by_priority) 
    { 
     // compare priority roles 
    } 
    else 
    { 
     // compare name roles 
    } 
} 

そして、私のスイッチのソート機能を持っているが、このような何か:

void MyProxyModel::switchSort(bool b) 
{ 
    sort_by_priority = b; 
    sort(0, Qt::AscendingOrder); 
} 

をしかし、これはしていません何もしないでください(この関数を呼び出した後は何も並べ替えられません)。これは明らかに正しいアプローチではありません。 (はい、setDynamicSortFilterが有効です)

私は、2つのプロキシモデルを作成して、優先度別に並べ替え、名前別に並べ替えるだけで、2つのプロキシモデルを切り替えるだけで、この問題を解決しました。しかし、これは非常に控えめな解決策であり、はるかに単純なものがなければならないことが分かります。しかし、私はまだQtの新機能を持っており、ドキュメントは圧倒的です。誰かが私を正しい方向に向けることができますか?

+2

あなたは[QSortFilterProxyModelを::無効化]を試してみました(http://doc.qt.io/qt-5/qsortfilterproxymodel.html#invalidate)? –

+0

私は今、それが動作している! –

答えて

0

現在の並べ替えが無効であること、つまり新しい並べ替え操作が実行されることを示すには、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(); 
} 
+0

ありがとう! –

関連する問題