问题描述
在我的小部件实现中,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