【问题标题】:How to set small column widths in QTreeWidget?如何在 QTreeWidget 中设置小列宽?
【发布时间】:2021-04-25 18:21:21
【问题描述】:

我有一个包含两列的 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: ',self.tree.header().sectionSize(1)) # Printing Size Here

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

        self.tree.header().resizeSection(1, 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 的任何值。

【问题讨论】:

    标签: python resize pyside2 qtreewidget qheaderview


    【解决方案1】:

    标题视图中部分大小的下限受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 时有效。其他模式不允许以编程方式设置节大小。

    【讨论】:

    • 太棒了!非常感谢
    猜你喜欢
    • 1970-01-01
    • 2013-02-19
    • 2019-09-29
    • 2012-06-27
    • 2021-03-29
    • 2013-02-16
    • 1970-01-01
    • 2021-01-10
    • 2020-11-14
    相关资源
    最近更新 更多