如何在 QTreeWidget 中设置小列宽?
How to set small column widths in 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: ',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 的任何值。
header 视图中部分大小的下限受 minimum section size. The default value of this property is calculated from the current font, style and 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 mode 为 Interactive
或 Fixed
时有效。其他模式不允许以编程方式设置部分大小。
我有一个包含两列的 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 的任何值。
header 视图中部分大小的下限受 minimum section size. The default value of this property is calculated from the current font, style and 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 mode 为 Interactive
或 Fixed
时有效。其他模式不允许以编程方式设置部分大小。