2011-03-22 25 views
1

我正在写一个Qt应用程序以允许非常重的数据集的可视化。因此,我有一个SourceDataModel类,继承QAbstractItemModel似乎正常工作(目前,我只显示它在QTableView/QTreeView但后来,我会创建一些自定义视图)。创建一个QAbstractModelItem的代理

现在,我想能够过滤该数据,即

  1. 能够具有不同的数据 分辨率(即仅暴露1 数据项总分2)

  2. 能够 应用上的数据的过滤器的一些(即 显示UNIX时间戳作为 DD/MM/YYYY HH:MM:SS)

所以我开始创建一个ProxySourceDataModel类,它继承自我的SourceDataModel并存储一个实例,并基本上将所有内容委托给实例。从这个ProxySourceDataModel,我注意到当我在QTableView中使用它时没有显示任何数据。经过一番调查,似乎是因为我不得不从底层的SourceDataModel转发信号和插槽。没问题,我做到了。

但仍2问题依然存在,而且我无法弄清楚如何处理它们:

  1. 我不能够在视图中选择数据。如果我直接使用SourceDataModel,没问题。但使用ProxySourceDataModel我不能选择任何东西。

  2. 数据根本没有被过滤!我在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了解更多信息。

谢谢!

+0

可能的重复[在QT中,链接模型不能按预期工作](http://stackoverflow.com/questions/1387912/in-qt-chaining-models-does-not-work-as-expected) – NewbiZ 2011-03-23 11:03:28

回答

2

问题在于该视图并未使用其模型中的QAbstractItemModel::data(),而是在其项目上调用QModelIndex::data(),该项目依次调用项目基础模型的QAbstractItemModel::data()。 而且由于我的代理从底层模型返回了模型索引,这就是为什么SourceDataModel::data()总是被调用而不是ProxySourceDataModel()

我刚刚重新实现了ProxySourceDataModel::index()返回本地索引,它就像一个魅力。 访问In QT, chaining models does not work as expected了解更多信息。