微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 QTreeWidget 中设置小列宽?

如何解决如何在 QTreeWidget 中设置小列宽?

我有一个包含两列的 QTreeWidget,我试图将第二列的宽度设置为一个非常小的值。

如果我将宽度设置为超过 35,它将正确调整大小。 但是,如果我尝试将宽度设置为 35 以下,它总是会以 35 结束。

有趣的注释: 不同的风格似乎给出了不同的“地板”值。 Fusion 不会比 35 更薄,Win 不会比 39 更薄。

这是一些示例代码,将创建一个 QTreeWidget,添加一些项目,然后设置并打印几次第二列宽度。

这是输出(至少在我这边):

This value should be 100:  100
This value should be 35:  35
This value should be 5:  35
This value should be 10:  35

所需的输出是:

This value should be 100:  100
This value should be 35:  35
This value should be 5:  5
This value should be 10:  10
from pyside2.QtWidgets import *
from pyside2.QtGui import *
from pyside2.QtCore import *
import sys

class Window(QDialog):
    def __init__(self,parent=None):
        super().__init__(parent)

        self.setLayout(QVBoxLayout())

        self.tree = QTreeWidget()

        self.tree.setHeaderLabels(['header1',''])
        self.tree.header().setStretchLastSection(False)
        self.tree.header().setSectionResizeMode(0,QHeaderView.Stretch)
        self.tree.header().setSectionResizeMode(1,QHeaderView.Fixed)

        for i in range(5):
            item = QTreeWidgetItem(['test','_'])
            self.tree.addTopLevelItem(item)

        self.layout().addWidget(self.tree)

        self.tree.header().resizeSection(1,100) # Setting Size Here
        print('This value should be 100: ',self.tree.header().sectionSize(1)) # Printing Size Here

        self.tree.header().resizeSection(1,35) # Setting Size Here
        print('This value should be 35: ',5) # Setting Size Here
        print('This value should be 5: ',10) # Setting Size Here
        print('This value should be 10: ',self.tree.header().sectionSize(1)) # Printing Size Here

        self.show()

app = QApplication(sys.argv)
app.setStyle(qstyleFactory.create('fusion')) 
window = Window()
sys.exit(app.exec_())

澄清一下,我没有尝试多次设置列宽。此代码这样做是为了演示将宽度设置为大于或小于 35 的值的各种结果。 我的愿望只是能够将列宽设置为小于 35 的任何值。

解决方法

标题视图中节大小的下限受 minimum section size 限制。此属性的默认值是根据当前字体、样式和 global strut 计算得出的。但是,它可以以编程方式设置,并且所有调整大小模式都将遵守该值。

因此在将示例更改为如下所示后:

class Window(QDialog):
    def __init__(self,parent=None):
        ...
        self.layout().addWidget(self.tree)

        print('default minimum size:',self.tree.header().minimumSectionSize())
        self.tree.header().setMinimumSectionSize(0)
        ...

您应该看到如下输出:

default minimum size: 35
This value should be 100:  100
This value should be 35:  35
This value should be 5:  5
This value should be 10:  10

可以通过将其设置为 -1 来恢复默认的最小尺寸。


注意resizeSection 仅在 resize modeInteractiveFixed 时有效。其他模式不允许以编程方式设置节大小。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。