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

标签 python pyqt pyqt5 qsplitter

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

布局与拆分器:

enter image description here enter image description here

最佳答案

问题出在您过早设置拉伸(stretch)因子这一事实。

  • setStretchFactor() 如果在尚不存在的小部件索引上完成,则将被忽略(请参阅 source code 了解其实现);
  • QSplitter 根据大小策略调整小部件的比例;尺寸政策还包括 horizontalvertical拉伸(stretch)因子,并且每当使用基本 setSizePolicy(horizo​​ntalPolicy, verticalPolicy) 再次设置时,它们将重置为 0 默认值(这意味着您可以在 QSizePolicy 中指定拉伸(stretch),这与使用 setStretchFactor)。

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

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

关于python - 调整 QSplitter 的大小不遵守 QSizePolicy 或 setStretchFactor?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68025665/

相关文章:

python - 使用 QWebEngineView 显示大于 2MB 的内容?

python - 有没有办法随机化主循环中子循环的顺序?

Python:如何分割包含额外分隔符作为值的字符串

python - 扫描文件夹时出现各种错误

python - NLTK:使用数字分数而不是标签进行文档分类

python - 为 linux 打包 python 应用程序

python - 如何获取当前的QApplication?

python - PyQt5 TableModel(QAbstractTableModel) 显示没有数据

python - 定期更新带有标签的 ProgressBar

python - 为什么使用 PyQt5 的 Python 在创建大量 QPushButton 时速度很慢?