我正在编写一个 Qt 应用程序以允许对非常重的数据集进行可视化。
所以,我有一个SourceDataModel
类,从它继承QAbstractItemModel
似乎工作正常(目前,我只在 QTableView/QTreeView 中显示它,但稍后,我将创建一些自定义视图)。
现在,我希望能够过滤这些数据,即
能够具有不同的数据分辨率(即仅公开 2 个数据项中的 1 个)
能够对数据应用一些过滤器(即将 unix 时间戳显示为 dd/MM/yyyy hh:mm:ss)
所以我开始创建一个ProxySourceDataModel
类,它继承自我的SourceDataModel
并存储一个实例,基本上将所有内容委托给该实例。由此ProxySourceDataModel
,我注意到在QTableView
. 经过一番调查,似乎是因为我必须从底层转发信号和插槽SourceDataModel
。没问题,我做到了。
但仍然存在 2 个问题,我不知道如何处理它们:
我无法在视图中选择数据。如果我
SourceDataModel
直接使用,没有问题。但是使用ProxySourceDataModel
i 不能选择任何东西。数据根本没有过滤!我在中重载了 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 中,链接模型无法按预期工作以获取更多信息。
谢谢!