非常に重いデータセットの視覚化を可能にする Qt アプリケーションを作成しています。
だから、私はSourceDataModel
クラスを持っており、それから継承するQAbstractItemModel
と正しく動作しているようです (現在、私は QTableView/QTreeView でのみ表示しますが、後でいくつかのカスタム ビューを作成します)。
さて、このデータをフィルタリングできるようにしたいと思います。
異なるデータ解像度を持つことができる (つまり、2 つのデータ項目のうち 1 つのデータ項目のみを公開する)
データにいくつかのフィルターを適用できる (つまり、UNIX タイムスタンプを dd/MM/yyyy hh:mm:ss として表示する)
そこでProxySourceDataModel
、my から継承してSourceDataModel
1 つのインスタンスを格納し、基本的にすべてをインスタンスに委譲するクラスの作成を開始しました。このことからProxySourceDataModel
、 で使用するとデータが表示されないことに気付きましたQTableView
。いくつかの調査の結果、基になる からシグナルとスロットを転送する必要があったためだと思われますSourceDataModel
。問題ありません。
しかし、まだ 2 つの問題が残っており、それらを処理する方法がわかりません。
ビューでデータを選択できません。
SourceDataModel
直接使用しても問題ありません。しかし、を使用すると、ProxySourceDataModel
何も選択できません。データはまったくフィルタリングされません。で data() をオーバーロード
ProxySourceDataModel
し、他のすべての呼び出しを基になる に転送しますSourceDataModel
。それでも、SourceDataModel::data()
呼び出されるだけです。
ここに私がやっていることを説明するためのいくつかのコードがあります:
class SourceDataModel : public QAbstractItemModel
{
//...
};
class ProxySourceDataModel : public SourceDataModel
{
public:
ProxySourceDataModel(SourceDataModel& model)
: model_(model)
{
// For all QAbstractItemModel's signals emitted by the underlying model,
// I propagate them like this
QObject::connect( &model_, SIGNAL( the_signal()),
this, SLOT (forward_the_signal())) ;
}
slots:
void forward_the_signal()
{
emit the_signal();
}
public:
// For all QAbstractItemModel's virtual function, I do something like this
virtual void the_function()
{
model_.the_function();
}
// This is where I was hoping to do the filtering
virtual QVariant data( const QModelIndex& index,int role=Qt::DisplayRole )
{
return filter( model_.data(index,role) );
}
private:
SourceDataModel& model_;
};
SourceDataModel sourceDataModel;
QTableView view;
view.setModel( new ProxySourceDataModel(sourceDataModel) );
ヘルプやアドバイスは大歓迎です。読んでくれてありがとう!
- - - - - - - - - - 編集 - - - - - - - - - - - -
見つけた!
問題は、ビューがQAbstractItemModel::data()
そのモデルから使用するのではなく、そのアイテムを呼び出し、そのアイテムの基になるモデルの をQModelIndex::data()
呼び出すことでした。QAbstractItemModel::data()
そして、私のプロキシは基になるモデルからモデル インデックスを返したので、常に!SourceDataModel::data()
の代わりに が呼び出されたのはそのためです。ProxySourceDataModel()
ローカル インデックスを返すように再実装したところProxySourceDataModel::index()
、魅力的に機能します。詳細については、QT ではモデルの連鎖が期待どおりに機能しないを参照してください。
ありがとう!