我正在写一个Qt应用程序以允许非常重的数据集的可视化。因此,我有一个SourceDataModel
类,继承QAbstractItemModel
似乎正常工作(目前,我只显示它在QTableView/QTreeView但后来,我会创建一些自定义视图)。创建一个QAbstractModelItem的代理
现在,我想能够过滤该数据,即
能够具有不同的数据 分辨率(即仅暴露1 数据项总分2)
能够 应用上的数据的过滤器的一些(即 显示UNIX时间戳作为 DD/MM/YYYY HH:MM:SS)
所以我开始创建一个ProxySourceDataModel
类,它继承自我的SourceDataModel
并存储一个实例,并基本上将所有内容委托给实例。从这个ProxySourceDataModel
,我注意到当我在QTableView
中使用它时没有显示任何数据。经过一番调查,似乎是因为我不得不从底层的SourceDataModel
转发信号和插槽。没问题,我做到了。
但仍2问题依然存在,而且我无法弄清楚如何处理它们:
我不能够在视图中选择数据。如果我直接使用
SourceDataModel
,没问题。但使用ProxySourceDataModel
我不能选择任何东西。数据根本没有被过滤!我在
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()
从它的模式,而是呼吁0它的项目,进而调用该项目的底层模型的QAbstractItemModel::data()
。 而且由于我的代理从底层模型返回了模型索引,这就是为什么SourceDataModel::data()
总是被调用而不是ProxySourceDataModel()
!
我刚刚重新实现了ProxySourceDataModel::index()
返回本地索引,它就像一个魅力。 访问In QT, chaining models does not work as expected了解更多信息。
谢谢!
可能的重复[在QT中,链接模型不能按预期工作](http://stackoverflow.com/questions/1387912/in-qt-chaining-models-does-not-work-as-expected) – NewbiZ 2011-03-23 11:03:28