Я пишу приложение Qt, позволяющее визуализировать очень тяжелые наборы данных.
Итак, у меня есть класс SourceDataModel
, унаследованный от QAbstractItemModel
, который, кажется, работает правильно (в настоящее время я отображаю его только в QTableView / QTreeView, но позже я создам несколько пользовательских представлений).
Теперь я хотел бы иметь возможность фильтровать эти данные, то есть
возможность иметь разное разрешение данных (то есть показывать только 1 элемент данных из 2)
возможность применять некоторые фильтры к данным (т.е. отображать временные метки unix как дд / мм / гггг чч: мм: сс)
Итак, я начал создавать ProxySourceDataModel
класс, который наследуется от моего SourceDataModel
и хранит один экземпляр, и в основном все делегирует этому экземпляру. Из этого 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 модели цепочки не работают должным образом для получения дополнительной информации.
Спасибо!