PyQt5:QSortFilterProxyModel 导致表视图标题重置其部分调整大小模式
Posted
技术标签:
【中文标题】PyQt5:QSortFilterProxyModel 导致表视图标题重置其部分调整大小模式【英文标题】:PyQt5: QSortFilterProxyModel causes table view header to reset its section resize mode 【发布时间】:2018-05-07 19:20:15 【问题描述】:我有一个带有可见标题的表格视图。为了使用排序的力量,我使用 QSortFilterProxyModel 作为包装模型。我还希望我的表格标题可以拉伸以适应表格宽度:
horizontal_header.setSectionResizeMode(QtWidgets.QHeaderView.Stretch)
它一直有效,直到我按下任何列(对项目进行排序)。在我这样做之后,标题会缩小到它的默认大小。但是,如果我在单击标题之前向表中添加一行,标题大小保持不变。所以,这里是问题测试用例:
使用拉伸标题初始化表
按标题对内容进行排序
标题缩小
TC2:
-
使用拉伸标题初始化表
在表格中添加一行
按标题进行排序
标题不会缩小。
注意:如果我不使用 QSortFilterProxyModel,则不会发生这种情况
【问题讨论】:
请阅读有关如何提供minimal reproducible example 的指南。 【参考方案1】:我知道我并没有为此发布最小示例,但是对于任何理解我的问题并面临同样问题的人来说,这是我设法解决它的方法: 只需继承 QSortFilterProxyModel 并覆盖 sort() 方法:
class MySortModel(QSortFilterProxyModel):
def sort(self, *args, **kwargs):
# check that there is no data to sort, if so - do not sort
if self.sourceModel().rowCount(QModelIndex()) > 0:
super().sort(*args, **kwargs)
这个想法是在模型中没有项目时禁用排序
【讨论】:
什么是table_item
?
@eyllanesc 内部数据结构,针对每个项目
您的解决方案似乎不是一个优质的解决方案,但您解释了这样的细节,因为没有它您的答案对其他人没有用处,我现在想给您投反对票。
self.sourceModel().table_item.row_count()
和self.sourceModel().rowCount()
有什么区别?
row_count 是我对 rowCount() 方法的包装,它需要有时很难获得的 QModelIndex() 对象。编辑了答案并排除了自定义项目逻辑。很抱歉听到你被否决,因为我挣扎了很长时间,没有找到任何与我的问题相近的东西,所以我编写了自己的解决方案,以便那些为此苦苦挣扎的人可以使用它。此外,粘贴整个模型代码,重写它以排除自定义逻辑需要非常多的时间,而且会非常庞大,只会让人们感到困惑。以上是关于PyQt5:QSortFilterProxyModel 导致表视图标题重置其部分调整大小模式的主要内容,如果未能解决你的问题,请参考以下文章