首页 > 解决方案 > 调整 QSplitter 的大小不尊重 QSizePolicy 或 setStretchFactor?

问题描述

我在 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_()

布局与拆分器:

在此处输入图像描述 在此处输入图像描述

标签: pythonpyqtpyqt5qsplitter

解决方案


问题在于您过早地设置了拉伸因子。

  • setStretchFactor()如果在尚不存在的小部件索引上完成,则将被忽略(请参阅其实现的源代码);
  • QSplitter 根据其大小策略调整小部件比例;size policy 还包括水平垂直拉伸因子,并且无论何时再次使用 basic 设置它们都会重置为 0 默认值setSizePolicy(horizontalPolicy, verticalPolicy)(这意味着您可以在 QSizePolicy 中指定拉伸,这与 using 相同setStretchFactor)。

解决方案很简单:在添加小部件设置它们的策​​略setStretchFactor移动线条。

显然,一种可能的替代方法是设置最大尺寸(基于 QSplitter 方向),但这并不完全相同
如果拆分器中的所有小部件都具有最大尺寸(包括仅存在一个小部件的情况),则结果是拆分器将具有基于这些小部件的最大尺寸,具体取决于其布局中(或“上方”)的其他小部件,但如果拆分器是顶级窗口,那么每当它被调整到大于其子级[ren]的最大值时,就会有一些空白空间。


推荐阅读