QSortFilterProxyModel 打破 columnWidths

Posted

技术标签:

【中文标题】QSortFilterProxyModel 打破 columnWidths【英文标题】:QSortFilterProxyModel breaks columnWidths 【发布时间】:2013-03-27 06:40:17 【问题描述】:

在通过 QSortFilterProxyModel(以任意顺序)隐藏/删除某些列的 QTableView 中保存列宽的标准做法是什么?请注意,我说的是在单个实例中隐藏和取消隐藏它们。

我已经尝试了很多方法(都是丑陋的)来实现它。我肯定做错了什么。

我查看了 QHeaderView::saveState() 和 QHeaderView::restoreState(),但除非我遗漏了什么,否则这实际上只适用于从关机到启动保存。一旦以不同的顺序隐藏和取消隐藏列,就会中断。

QSortFilterProxyModel 使用 filterAcceptsColumn() 可以正常工作。需要注意的是,当 filterAcceptsColumn() 在先前返回 false 的列上返回 true 时。我运行 invalidateFilter() 并将其绘制在 QTableView 中。但是,QTableView 对列宽使用了一些默认值(似乎是 100),而不是在 QSortFilterProxyModel 隐藏列之前的宽度。

想法?

【问题讨论】:

对于这样的控制,只使用 QHeaderView::setSectionHidden() 并一起取消 QSortFilterProxy 是否更聪明?我开始但认为有点太麻烦的另一个解决方案是保留某种类型的“真实索引”容器,而不是 QHeaderView 认为的索引。 【参考方案1】:

是的,请改用setSectionHidden()

一般来说,您应该尝试将与视图相关的代码(例如在运行时显示/隐藏列)保留在模型之外。在我们的应用程序中,我们有QTableViewQHeaderView 的子类,它们允许用户使用上下文菜单显示/隐藏列;显示/隐藏列宽(以及位置)时不会触及它们。

filterAcceptsColumn 可用于完全禁用主键、外键等列。

【讨论】:

谢谢,蒂姆。这有帮助。从我注意到的情况来看,使用 setSectionHidden() 有一个警告,而不是在 QSortFilterProxModel 中阻止它。也就是说,paint() 仍然会绘制隐藏的单元格……至少在过滤器无效时是这样。 [OOPS EDIT:] 但是,我明白你的意思。 QSortFilterProxy 模型应该较少用于任意过滤,而更多用于某种类型的预设过滤。似乎有道理。任何人,我想我会继续这种模式,因为我在这上面花了太多时间。 :)

以上是关于QSortFilterProxyModel 打破 columnWidths的主要内容,如果未能解决你的问题,请参考以下文章

QSortFilterProxyModel 仅对获取的数据进行排序

链式 QSortFilterProxyModel

QSortFilterProxyModel 不更新 QTableview

QSortFilterProxyModel.mapToSource 崩溃。没有信息为啥

为视图创建多个 QSortFilterProxyModel 实例

使用 QSortFilterProxyModel 过滤 QTableView 后保留选择