如何使用带有 Qabstractitemmodel 的 QSortFilterProxyModel 隐藏第一列

问题描述

在我的小部件实现中,model 源模型(从 qabstractitemmodel 派生),proxy_model(从 QSortFilterProxyModel 派生)代理,以及 tree(QTreeView)代表模型的树。

我想隐藏第一列。 我尝试使用 tree.hideColumn(0),树显示为平面。

  • 如果我在代理中子类化 filteracceptsColumn 以仅对第二列返回 True,则不会显示任何行。 我相信这是因为父/子关系锚定在索引的第一列上,并且当代理请求列 1 的给定索引的行数时,模型返回 0(这是如果我理解得很好,模型实现)。
  • 如果我将 rowCount 设置为在模型中为列索引 > 0 返回非 0 值,我可以看到树和行,但是模型没有通过 qabstractitemmodelTester 测试以下错误
qt.modeltest: FAIL! childindex != childindex1 () returned FALSE

我很清楚在树模型中,子索引必须附加到单个父索引(第一列)。 但是,如果源模型的父子关系没有被代理保留,如果第一列被过滤,我应该如何隐藏代理模型中的第一列?我觉得这是代理的“错误”,或者我错过了什么!

有没有人知道在不丢失父/子信息的情况下过滤/隐藏树视图中第一列的正确方法,并且仍然验证 qmodel 实现?

谢谢!

解决方法

正确且正确的实现至少需要代理为 second 列的父列创建索引,需要正确实现 index()parent()、{{ 1}} 和 mapToSource()。对于可能非常棘手的树模型。

如果源模型不太复杂并且其所有功能都正确实现,则可能的解决方法是仅覆盖代理的 mapFromSource()(和 data())并始终返回下一列。

以下测试是使用简单的 QStandardItemModel 完成的,但我认为使用 QAbstractItemModel 应该没有任何不同,只要它正确实现即可。

headerData