我在 QSplitter 中设置了项目的大小策略,但它似乎没有任何影响。当我在下面的示例中调整窗口大小时,我希望我的左侧小部件在达到其大小提示 (QSizePolicy.Preferred) 时停止增长,并希望右侧小部件尽可能大地扩展 (QSizePolicy.Expanding)。
如果我将它们放在布局中,它会起作用:
from PyQt5 import QtWidgets, QtCore
app = QtWidgets.QApplication([])
class ColoredBox(QtWidgets.QFrame):
def __init__(self, color):
super().__init__()
self.setStyleSheet(f'background-color: {color}')
def sizeHint(self) -> QtCore.QSize:
return QtCore.QSize(200, 200)
box1 = ColoredBox('red')
box2 = ColoredBox('green')
splitter = QtWidgets.QHBoxLayout()
splitter.setContentsMargins(0, 0, 0, 0)
splitter.setSpacing(0)
splitter.addWidget(box1)
splitter.addWidget(box2)
box1.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
box2.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
container = QtWidgets.QWidget()
container.setLayout(splitter)
container.show()
app.exec_()
但是如果我把它们放在 QSplitter 中它就不起作用了,分割器只是均匀地分割它们之间的空间:
from PyQt5 import QtWidgets, QtCore
from PyQt5.QtCore import Qt
app = QtWidgets.QApplication([])
class ColoredBox(QtWidgets.QFrame):
def __init__(self, color):
super().__init__()
self.setStyleSheet(f'background-color: {color}')
def sizeHint(self) -> QtCore.QSize:
return QtCore.QSize(200, 200)
box1 = ColoredBox('red')
box2 = ColoredBox('green')
splitter = QtWidgets.QSplitter(Qt.Horizontal)
splitter.setStretchFactor(0, 0)
splitter.setStretchFactor(1, 1)
splitter.addWidget(box1)
splitter.addWidget(box2)
box1.setSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
box2.setSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
container = QtWidgets.QMainWindow()
container.setCentralWidget(splitter)
container.show()
app.exec_()
布局与拆分器:
最佳答案
问题出在您过早设置拉伸(stretch)因子这一事实。
setStretchFactor()
如果在尚不存在的小部件索引上完成,则将被忽略(请参阅 source code 了解其实现);- QSplitter 根据大小策略调整小部件的比例;尺寸政策还包括 horizontal和 vertical拉伸(stretch)因子,并且每当使用基本
setSizePolicy(horizontalPolicy, verticalPolicy)
再次设置时,它们将重置为 0 默认值(这意味着您可以在 QSizePolicy 中指定拉伸(stretch),这与使用setStretchFactor
)。
解决方案很简单:添加小部件并设置它们的策略后移动setStretchFactor
行。
显然,一种可能的替代方法是设置最大尺寸(基于 QSplitter 方向),但这不完全是一回事。
如果拆分器中的所有小部件都有最大尺寸(包括只有 一个 小部件存在的情况),结果是拆分器将根据这些小部件具有最大尺寸,具体取决于 (或“上方”)它的布局,但如果拆分器是顶层窗口,那么只要将其调整为大于其子 [ren] 的最大值的大小,就会留下一些空白空间。
关于python - 调整 QSplitter 的大小不遵守 QSizePolicy 或 setStretchFactor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68025665/