QSortFilterProxyModelプロキシを使用して列を並べ替える単純なモデルビューツリービューが
あり、各列のモデルとしてQStandardItemModelがありますが、正しく並べ替えられる文字列がありますが、数値(文字列として)を含む列には並べ替えが間違っています。
私は9,12,1を持っていると言います(私がそれらを並べ替えると、それぞれの番号は1,12,9または12,1,9になりますが、正しい順序にはなりません。1,9,12または12,9,1のようになぜですか?
また、行を列で並べ替えるときに m_model->item(iSelectedRow,0)->text();
、最初の列のテキストを取得して新しい列のテキストを取得しようとすると、新しい並べ替えられた列のテキストは取得されないことに気付きます。なぜですか?
3 に答える
これは、デフォルトでは、QSortFilterProxyModelがDisplayRoleでソートされるためです。それが文字列を返す場合、文字列をソートします。モデルを他の値で並べ替えるには、ソースモデルでカスタムの並べ替えの役割を定義し、プロキシに設定します。
class MyModel {
...
enum Role {
SortRole=Qt::UserRole
};
QVariant data( ... ) const {
...
switch ( role ) {
case Qt::DisplayRole:
return value as string;
case SortRole:
return value as int;
}
}
};
...
sortfilterproxy->setSortRole( MyModel::SortRole );
2番目の質問:m_modelとは何ですか?ソースモデル、またはsortfilterproxymodel?前者はソートによって変更されることはなく、ソートはプロキシでのみ行われます。
文字列「9」、「12」、「1」を並べ替えると、「1」、「12」、「9」(辞書式順序)になります。それらを数値としてソートする場合は、QSortFilterProxyModelをサブクラス化し、QString :: toInt()を使用できるlessThanメンバー関数を再実装する必要があります。
優れたQtドキュメントを調べることで、これらすべてを見つけることができます。ここには、mapToSource()、mapFromSource()、mapSelectionToSource()、およびmapSelectionFromSource()に関する情報があり、ソースQModelIndexesをソート/フィルター処理されたモデルインデックスに、またはその逆に変換します。
以下に示すようにテーブルに入力するときは、QStandardItem :: setData()を使用してください。その後、すべてが期待どおりに機能します。
Qtドキュメントの以下の行
virtual void QStandardItem::setData(const QVariant & value, int role = Qt::UserRole + 1)
セットデータの簡単な使い方は次のとおりです。
item->setData(intData, Qt::DisplayRole);