1

我正在编写一个 Qt 应用程序以允许对非常重的数据集进行可视化。

所以,我有一个SourceDataModel类,从它继承QAbstractItemModel似乎工作正常(目前,我只在 QTableView/QTreeView 中显示它,但稍后,我将创建一些自定义视图)。

现在,我希望能够过滤这些数据,即

  1. 能够具有不同的数据分辨率(即仅公开 2 个数据项中的 1 个)

  2. 能够对数据应用一些过滤器(即将 unix 时间戳显示为 dd/MM/yyyy hh:mm:ss)

所以我开始创建一个ProxySourceDataModel类,它继承自我的SourceDataModel并存储一个实例,基本上将所有内容委托给该实例。由此ProxySourceDataModel,我注意到在QTableView. 经过一番调查,似乎是因为我必须从底层转发信号和插槽SourceDataModel。没问题,我做到了。

但仍然存在 2 个问题,我不知道如何处理它们:

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

  2. 数据根本没有过滤!我在中重载了 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 中,链接模型无法按预期工作以获取更多信息。

谢谢!

4

1 回答 1

2

问题是视图不使用QAbstractItemModel::data()它的模型,而是调用QModelIndex::data()它的项目,这反过来又调用QAbstractItemModel::data()了项目的底层模型。而且由于我的代理从底层模型返回模型索引,这就是为什么SourceDataModel::data()总是调用 ! 而不是ProxySourceDataModel()!

我只是重新实现ProxySourceDataModel::index()以返回本地索引,它就像一个魅力。访问在 QT 中,链接模型无法按预期工作以获取更多信息。

于 2011-03-23T11:05:31.453 回答