【问题标题】:Resizing QSplitter doesn't respect QSizePolicy or setStretchFactor?调整 QSplitter 的大小不尊重 QSizePolicy 或 setStretchFactor?
【发布时间】:2021-06-17 19:44:11
【问题描述】:

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

布局与拆分器:

【问题讨论】:

  • 试试 --> splitter.setSizes([splitter.size().height() * 0.3, splitter.size().height() * 0.7])
  • 或 splitter.splitter.setSizes([100,300])

标签: python pyqt pyqt5 qsplitter


【解决方案1】:

问题在于您将拉伸因子设置得太早。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    • 2020-03-14
    • 1970-01-01
    相关资源
    最近更新 更多