Qt 在共享相同数据模型的两个表中显示不同的标题名称?

Qt 在共享相同数据模型的两个表中显示不同的标题名称?,qt,qsortfilterproxymodel,Qt,Qsortfilterproxymodel,我有两个不同的表,它们基于相同的数据模型。它们的内容由它们自己的QSortFilterProxyModel基于相同的数据模型生成。问题是我不能给他们不同的标题名。在以下示例中,两个表的名称均为Table2。我该怎么做才能让它们显示不同的标题名称 QStandardItemModel* model = new QStandardItemModel(); QSortFilterProxyModel* proxyModel1 = new QSortFilterProxyModel(this); pr

我有两个不同的表,它们基于相同的数据模型。它们的内容由它们自己的QSortFilterProxyModel基于相同的数据模型生成。问题是我不能给他们不同的标题名。在以下示例中,两个表的名称均为Table2。我该怎么做才能让它们显示不同的标题名称

QStandardItemModel* model = new QStandardItemModel();

QSortFilterProxyModel* proxyModel1 = new QSortFilterProxyModel(this);
proxyModel1->setSourceModel(model);
proxyModel1->setHeaderData(0,  Qt::Horizontal, "Table1");


QSortFilterProxyModel* proxyModel2 = new QSortFilterProxyModel(this);
proxyModel2->setSourceModel(model);
proxyModel2->setHeaderData(0,  Qt::Horizontal, "Table2");

根据评论,你可能会有类似下面的裸体例子

class proxy_model: public QSortFilterProxyModel {
  using super = QSortFilterProxyModel;
public:
  explicit proxy_model (QObject *parent = nullptr)
    : super(parent)
    {}
  virtual QVariant headerData (int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const override
    {
        if (section == 0 && orientation == Qt::Horizontal && role == Qt::DisplayRole)
        {
            return m_data.at(section).at(orientation).at(role);
        }
        else
        {
            return super::headerData(section, orientation, role);
        }
    }
  virtual bool setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role = Qt::EditRole) override
    {
      m_data[section][orientation][role] = value;
      return true;
    }
private:
  std::map<int/* section */, std::map<Qt::Orientation/* orientation */, std::map<int/* role */, QVariant>>> m_data;
};

我认为这是不可能的,因为头数据在两个视图之间通过单个模型共享,而模型不知道它向哪个视图提供数据。您应该使用相同模型的两个实例。请注意,
qabstractemmodel::headerData
setHeaderData
都是虚拟的,因此您可以创建自己的代理模型,该模型继承自
QSortFilterProxyModel
并设置/获取数据本身,而不是简单地将请求委托给源模型。
auto *model = new QStandardItemModel;

auto*proxyModel1 = new proxy_model(this);
proxyModel1->setSourceModel(model);
proxyModel1->setHeaderData(0,  Qt::Horizontal, "Table1");


auto *proxyModel2 = new proxy_model(this);
proxyModel2->setSourceModel(model);
proxyModel2->setHeaderData(0,  Qt::Horizontal, "Table2");