调整 QSplitter 的大小不遵守 QSizePolicy 或 setStretchFactor 吗?

3
我设置了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_()

布局 vs 分裂器:

enter image description here enter image description here


尝试 --> splitter.setSizes([splitter.size().height() * 0.3, splitter.size().height() * 0.7]) - virxen
splitter.splitter.setSizes([100,300]) 拆分器.拆分器.设置尺寸([100, 300]) - virxen
1个回答

4
问题在于您设置了拉伸因子太早。
  • 如果在尚不存在的小部件索引上执行setStretchFactor(),它将被忽略(请参阅其实现的源代码);
  • QSplitter根据小部件的大小策略调整小部件比例; 大小策略还包括水平垂直拉伸因子,并且每当使用基本的setSizePolicy(horizontalPolicy, verticalPolicy)再次设置时,它们会被重置为0默认值(这意味着您可以在QSizePolicy中指定拉伸,这与使用setStretchFactor相同)。
解决方案很简单:在添加小部件并设置其策略后移动setStretchFactor行。
显然,一种可能的替代方案是根据QSplitter的方向设置最大尺寸,但那并不完全相同。如果拆分器中的所有小部件都有最大尺寸(包括仅存在一个小部件的情况),则结果是拆分器将具有基于这些小部件的最大尺寸,具体取决于其布局中的其他小部件,但如果拆分器是顶层窗口,则每当它调整大小到比其子项的最大值更大时,将会保留一些空白空间。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接