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 导致表视图标题重置其部分调整大小模式的主要内容,如果未能解决你的问题,请参考以下文章

PyQt5快速入门

python pyqt5 自定义信号和槽

PyQt5 和 Anaconda:ModuleNotFoundError:没有名为“PyQt5”的模块

PyQt5 与 QML

PyQt5快速入门PyQt5信号槽机制

PyQt5快速入门PyQt5布局管理