gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:58:22 28 4
gpt4 key购买 nike

QAbstractItemModel 有一个 setHeaderData( int section, ..... ) 方法,该方法根据标题方向采用行或列的部分。我有一个模型,其中包含几个表,这些表都是顶级项目的子项。也就是说,我的模型层次结构的第一级(在不可见的根下)由 8 行组成,每行都有一个子元素,它是一个表(当然总共 8 个表)。看来 setHeaderData 将为第一级提供带有标题的 View ,但是如何为这些子表指定标题数据? QTableView 有一个 setRootIndex() 方法,因此它可以深入模型层次结构并显示这些子表中的数据,我希望 setHeaderData 也采用根索引,但事实并非如此。我可以在 QTableView 上手动设置标题,但这更麻烦——有没有更好的解决方案?

最佳答案

不幸的是,模型 API 没有提供一个很好的方法来做到这一点。最简单的解决方案是让你的模型返回不同的 headerData取决于当前使用的根索引。然而,这意味着模型需要知道 View 的状态(更具体地说,根索引),这不是您通常想要的。

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

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;

};

此代理模型使用源模型通过两个自定义角色提供的 header 。例如,如果您使用 QStandardItemModel ,设置标题就像这样简单:
model.item(0, 1)->setData(QStringList() << "h1" << "h2", 
ChildHeadersProxy::HorizontalHeaderRole);
model.item(0, 1)->setData(QStringList() << "vh1" << "vh2",
ChildHeadersProxy::VerticalHeaderRole);

哪里 model.item(0, 1)是对应的根项。设置 View 将如下所示:
QTableView view;
ChildHeadersProxy proxy;
proxy.setSourceModel(&model);
view.setModel(&proxy);

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

关于Qt:如何在 QAbstractItemModel 中的子表上设置标题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30221440/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com