1

非常に重いデータセットの視覚化を可能にする Qt アプリケーションを作成しています。

だから、私はSourceDataModelクラスを持っており、それから継承するQAbstractItemModelと正しく動作しているようです (現在、私は QTableView/QTreeView でのみ表示しますが、後でいくつかのカスタム ビューを作成します)。

さて、このデータをフィルタリングできるようにしたいと思います。

  1. 異なるデータ解像度を持つことができる (つまり、2 つのデータ項目のうち 1 つのデータ項目のみを公開する)

  2. データにいくつかのフィルターを適用できる (つまり、UNIX タイムスタンプを dd/MM/yyyy hh:mm:ss として表示する)

そこでProxySourceDataModel、my から継承してSourceDataModel1 つのインスタンスを格納し、基本的にすべてをインスタンスに委譲するクラスの作成を開始しました。このことからProxySourceDataModel、 で使用するとデータが表示されないことに気付きましたQTableView。いくつかの調査の結果、基になる からシグナルとスロットを転送する必要があったためだと思われますSourceDataModel。問題ありません。

しかし、まだ 2 つの問題が残っており、それらを処理する方法がわかりません。

  1. ビューでデータを選択できません。SourceDataModel直接使用しても問題ありません。しかし、を使用すると、ProxySourceDataModel何も選択できません。

  2. データはまったくフィルタリングされません。で 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 ではモデルの連鎖が期待どおりに機能しないを参照してください。

ありがとう!

4

1 に答える 1

2

問題は、ビューがQAbstractItemModel::data()そのモデルから使用するのではなく、そのアイテムを呼び出し、そのアイテムの基になるモデルの をQModelIndex::data()呼び出すことでした。QAbstractItemModel::data()そして、私のプロキシは基になるモデルからモデル インデックスを返したので、常に!SourceDataModel::data()の代わりに が呼び出されたのはそのためです。ProxySourceDataModel()

ローカル インデックスを返すように再実装したところProxySourceDataModel::index()、魅力的に機能します。詳細については、QT ではモデルの連鎖が期待どおりに機能しないを参照してください。

于 2011-03-23T11:05:31.453 に答える