Qt:如何在QabstracteModel中设置子表的标题?
QabstracteModel有一个setHeaderData(int section,…)方法,该方法根据标题方向获取一个行或列的节。我有一个模型,其中包含多个表,这些表都是顶级项的子项。也就是说,我的模型层次结构的第一级(在不可见根下)由8行组成,每行有一个子元素,它是一个表(当然总共8个表)。setHeaderData似乎将为第一级视图提供标题,但如何为这些子表指定标题数据?QTableView有一个setRootIndex()方法,因此它可以深入到模型层次结构并显示这些子表中的数据,我希望setHeaderData也采用根索引,但它没有。我可以在QTableView上手动设置标题,但这要复杂得多——有更好的解决方案吗?不幸的是,ModelAPI没有提供一种很好的方法来实现这一点。最简单的解决方案是根据当前使用的根索引,使模型返回不同的Qt:如何在QabstracteModel中设置子表的标题?,qt,Qt,QabstracteModel有一个setHeaderData(int section,…)方法,该方法根据标题方向获取一个行或列的节。我有一个模型,其中包含多个表,这些表都是顶级项的子项。也就是说,我的模型层次结构的第一级(在不可见根下)由8行组成,每行有一个子元素,它是一个表(当然总共8个表)。setHeaderData似乎将为第一级视图提供标题,但如何为这些子表指定标题数据?QTableView有一个setRootIndex()方法,因此它可以深入到模型层次结构并显示这些子表中的数据,我希
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));
我没有试过,但你的解决方案看起来不错——非常灵活。我认为对于我的应用程序,由于模型非常严格,因此只为表视图返回一个单独的标题模型会更简单。不过谢谢你。