我正在编写一个Qt应用程序,以允许可视化非常繁重的数据集。
所以,我有一个SourceDataModel
类,继承自QAbstractItemModel
似乎工作正常(目前,我只在QTableView / QTreeView中显示它,但稍后我将创建一些自定义视图)
现在,我希望能够过滤这些数据,即
能够拥有不同的数据 决议(即只暴露1 数据项中的2)
能够 对数据应用一些过滤器(即 将unix时间戳显示为 dd / MM / yyyy hh:mm:ss)
所以我开始创建一个ProxySourceDataModel
类,它继承自我的SourceDataModel
并存储一个实例,并基本上将所有内容委托给实例。从ProxySourceDataModel
开始,我注意到在QTableView
中使用它时没有显示任何数据。经过一番调查后,似乎是因为我不得不转发底层SourceDataModel
的信号和插槽。没问题,我做到了。
但仍有2个问题,我无法弄清楚如何处理它们:
我无法在视图中选择数据。如果我直接使用SourceDataModel
,没问题。但是使用ProxySourceDataModel
我无法选择任何内容。
根本没有过滤数据!我在ProxySourceDataModel
中重载了data(),并将所有其他调用转发给基础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) );
非常感谢任何帮助或建议,感谢阅读!
-------------------- EDIT ----------------------- -
我找到了它!
问题在于视图不会在其模型中使用QAbstractItemModel::data()
,而是在其项目上调用QModelIndex::data()
,而这些项目又调用项目底层模型的QAbstractItemModel::data()
。
由于我的代理从底层模型返回了模型索引,因此总是调用SourceDataModel::data()
而不是ProxySourceDataModel()
!
我刚刚重新实现ProxySourceDataModel::index()
以返回本地索引,它就像一个魅力。
访问In QT, chaining models does not work as expected了解更多信息。
谢谢!
答案 0 :(得分:2)
问题在于视图不会在其模型中使用QAbstractItemModel::data()
,而是在其项目上调用QModelIndex::data()
,而这些项目又调用项目底层模型的QAbstractItemModel::data()
。
由于我的代理从底层模型返回了模型索引,因此总是调用SourceDataModel::data()
而不是ProxySourceDataModel()
!
我刚刚重新实现ProxySourceDataModel::index()
以返回本地索引,它就像一个魅力。
访问In QT, chaining models does not work as expected了解更多信息。