Создайте прокси QAbstractModelItem

Я пишу приложение Qt, позволяющее визуализировать очень тяжелые наборы данных.

Итак, у меня есть класс SourceDataModel, унаследованный от QAbstractItemModel, который, кажется, работает правильно (в настоящее время я отображаю его только в QTableView / QTreeView, но позже я создам несколько пользовательских представлений).

Теперь я хотел бы иметь возможность фильтровать эти данные, то есть

  1. возможность иметь разное разрешение данных (то есть показывать только 1 элемент данных из 2)

  2. возможность применять некоторые фильтры к данным (т.е. отображать временные метки unix как дд / мм / гггг чч: мм: сс)

Итак, я начал создавать ProxySourceDataModel класс, который наследуется от моего SourceDataModel и хранит один экземпляр, и в основном все делегирует этому экземпляру. Из этого 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 модели цепочки не работают должным образом для получения дополнительной информации.

Спасибо!


person NewbiZ    schedule 22.03.2011    source источник


Ответы (1)


Проблема заключалась в том, что представление не использует QAbstractItemModel::data() из своей модели, а скорее вызывает QModelIndex::data() для своих элементов, что, в свою очередь, вызывает QAbstractItemModel::data() базовой модели элемента. И поскольку мой прокси-сервер возвращал модельные индексы из базовой модели, именно поэтому SourceDataModel::data() всегда вызывался вместо ProxySourceDataModel()!

Я просто повторно реализовал ProxySourceDataModel::index(), чтобы вернуть локальные индексы, и это работает как шарм. Посетите В QT модели цепочки не работают должным образом для получения дополнительной информации.

person NewbiZ    schedule 23.03.2011