2016-08-31 2 views
1

QStandardItemModelをソースモデルとして使用して、1つのテーブルビューにデータを表示しています。 フィルタデータを表示するもう1つのテーブルビューは、カスタムフィルタプロキシモデル(QSortFilterProxyモデルのサブクラスサブクラス)を使用して、QStandardItemmodelにフィルタ操作を適用するともう一度適用されます。Qtでカスタムフィルタプロキシモデルからデータを消去すると、ソースモデルからも削除されます

カスタムフィルタプロキシモデル(QSortFilterProxyモデルのサブクラス)からデータを削除しようとすると、そのデータは ソースモデル(QStandardItemModel)から削除されます。それを避ける方法は?

サンプルコード:私は

proxyModel->removeRows(0,proxyModel->rowCount()); 

を行うと

MySortFilterProxyModel *proxyModel; 
QStandardItemModel *model 
QTreeView *sourceView; 
QTreeView *proxyView; 

proxyModel->setSourceModel(model); 
sourceView->setModel(model); 
proxyView->setModel(proxyModel); 

はまた、そのソースモデル(QStandardItemModel *model)からデータを削除します。

答えて

1

自分でvirtual bool removeRows(...)を再実装する必要があります。 Qt docを確認してください:

独自のモデルを実装する場合、削除をサポートしたい場合は、この機能を再実装することができます。あるいは、データを変更するための独自のAPIを提供することもできます。

QSortFilterProxyModelは、データのソートまたはフィルタリングに使用する必要があります。

QSortFilterProxyModelクラスは、別のモデルとビューの間で渡されるデータのソートとフィルタリングをサポートしています。

私はたとえば、要素の状態を確認し、それをフィルタリングするためのフラグを使用することをお勧めします。

enum State {Valid, Invalid} 

今すぐあなたのQSortFilterProxyModel::filterAcceptsRow(..)内の要素の状態をチェックするために、新たな条件を追加します。

const State state = _sourceModel->data(index, Qt::UserRole).toInt(&); 
return state == Valid; 

sourceModelで、Qt :: UserRoleの仮想関数data()内の要素の状態または必要な役割を返す必要があります。

QSortFilterProxyModelから行を削除する場合は、要素の状態を変更し、invalidate()を呼び出してフィルタを更新します。

ソースモデルからグローバルに削除する場合は、removeRowsを使用します。

+0

Ok Thanx.Iこれが取得されました。 –

関連する問題