Показать разные имена заголовков в 2 таблицах, которые используют одну и ту же модель данных? - PullRequest
0 голосов
/ 13 марта 2020

У меня есть 2 разные таблицы, основанные на одной модели данных. Их содержимое генерируется с помощью их собственной 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");

1 Ответ

1 голос
/ 13 марта 2020

В соответствии с комментарием у вас может быть что-то вроде следующего простого примера ...

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;
};

Тогда ваш код становится (непроверенным) ...

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");
...