Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt:如何在QabstracteModel中设置子表的标题?_Qt - Fatal编程技术网

Qt:如何在QabstracteModel中设置子表的标题?

Qt:如何在QabstracteModel中设置子表的标题?,qt,Qt,QabstracteModel有一个setHeaderData(int section,…)方法,该方法根据标题方向获取一个行或列的节。我有一个模型,其中包含多个表,这些表都是顶级项的子项。也就是说,我的模型层次结构的第一级(在不可见根下)由8行组成,每行有一个子元素,它是一个表(当然总共8个表)。setHeaderData似乎将为第一级视图提供标题,但如何为这些子表指定标题数据?QTableView有一个setRootIndex()方法,因此它可以深入到模型层次结构并显示这些子表中的数据,我希

QabstracteModel有一个setHeaderData(int section,…)方法,该方法根据标题方向获取一个行或列的节。我有一个模型,其中包含多个表,这些表都是顶级项的子项。也就是说,我的模型层次结构的第一级(在不可见根下)由8行组成,每行有一个子元素,它是一个表(当然总共8个表)。setHeaderData似乎将为第一级视图提供标题,但如何为这些子表指定标题数据?QTableView有一个setRootIndex()方法,因此它可以深入到模型层次结构并显示这些子表中的数据,我希望setHeaderData也采用根索引,但它没有。我可以在QTableView上手动设置标题,但这要复杂得多——有更好的解决方案吗?

不幸的是,ModelAPI没有提供一种很好的方法来实现这一点。最简单的解决方案是根据当前使用的根索引,使模型返回不同的
headerData
。但是,这意味着模型需要知道视图的状态(更具体地说,是根索引),这不是您通常想要的

我认为设置代理模型可能是解决这个问题的一个很好的方法。以下是如何实现它:

class ChildHeadersProxy : public QSortFilterProxyModel {
public:
  static const int HorizontalHeaderRole = Qt::UserRole + 1;
  static const int VerticalHeaderRole = Qt::UserRole + 2;

  void setRootIndex(const QModelIndex& index) {
    m_rootIndex = index;
    if (sourceModel()) {
      emit headerDataChanged(Qt::Horizontal, 0, sourceModel()->columnCount(m_rootIndex));
      emit headerDataChanged(Qt::Vertical, 0, sourceModel()->rowCount(m_rootIndex));
    }
  }

  QVariant headerData(int section, Qt::Orientation orientation, 
                      int role = Qt::DisplayRole) const {
    if (sourceModel() && m_rootIndex.isValid()) {
      int role = orientation == Qt::Horizontal ? HorizontalHeaderRole : VerticalHeaderRole;
      QStringList headers = sourceModel()->data(m_rootIndex, role).toStringList();
      if (section >= 0 && section < headers.count()) {
        return headers[section];
      }
    }
    return QSortFilterProxyModel::headerData(section, orientation, role);
  }

private:
  QModelIndex m_rootIndex;

};
其中,
model.item(0,1)
是对应的根项。设置视图的方式如下所示:

QTableView view;
ChildHeadersProxy proxy;
proxy.setSourceModel(&model);
view.setModel(&proxy);
view.setRootIndex(proxy.mapFromSource(model.index(0, 1)));
proxy.setRootIndex(model.index(0, 1));
更改根索引将如下所示:

QTableView view;
ChildHeadersProxy proxy;
proxy.setSourceModel(&model);
view.setModel(&proxy);
view.setRootIndex(proxy.mapFromSource(model.index(0, 1)));
proxy.setRootIndex(model.index(0, 1));

我没有试过,但你的解决方案看起来不错——非常灵活。我认为对于我的应用程序,由于模型非常严格,因此只为表视图返回一个单独的标题模型会更简单。不过谢谢你。