创建QAbstractModelItem的代理

时间:2011-03-22 11:43:18

标签: c++ qt proxy qabstractitemmodel

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

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

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

  1. 能够拥有不同的数据 决议(即只暴露1 数据项中的2)

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

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

    但仍有2个问题,我无法弄清楚如何处理它们:

    1. 我无法在视图中选择数据。如果我直接使用SourceDataModel,没问题。但是使用ProxySourceDataModel我无法选择任何内容。

    2. 根本没有过滤数据!我在ProxySourceDataModel中重载了data(),并将所有其他调用转发给基础SourceDataModel。但仍然只调用SourceDataModel::data()

    3. 以下是一些代码来说明我在做什么:

      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了解更多信息。

      谢谢!

1 个答案:

答案 0 :(得分:2)

问题在于视图不会在其模型中使用QAbstractItemModel::data(),而是在其项目上调用QModelIndex::data(),而这些项目又调用项目底层模型的QAbstractItemModel::data()。 由于我的代理从底层模型返回了模型索引,因此总是调用SourceDataModel::data()而不是ProxySourceDataModel()

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