首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调整QSplitter大小不尊重QSizePolicy或setStretchFactor?

调整QSplitter大小不尊重QSizePolicy或setStretchFactor?
EN

Stack Overflow用户
提问于 2021-06-17 19:44:11
回答 1查看 636关注 0票数 3

我在QSplitter中设置了项的大小策略,但它似乎没有任何影响。当我在下面的示例中调整窗口大小时,我希望我的左小部件在达到其大小提示(QSizePolicy.Preferred)时停止增长,而右边的小部件则尽可能大(QSizePolicy.Expanding)。

如果我把它们放在一个布局里就行了:

代码语言:javascript
复制
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中,拆分器只会将它们之间的间隔均匀地分开,就不起作用了:

代码语言:javascript
复制
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_()

布局与拆分:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-06-17 23:24:27

问题来自这样一个事实,那就是你过早地设定了拉伸因子。

  • 如果对还不存在的小部件索引执行setStretchFactor(),则会忽略它(有关其实现,请参见源代码 );
  • QSplitter根据其大小策略调整小部件的比例;大小策略还包括水平垂直拉伸因子,每当使用基本setSizePolicy(horizontalPolicy, verticalPolicy)再次设置时,它们将重置为0默认值(这意味着您可以在QSizePolicy中指定弹力,这与使用setStretchFactor相同)。

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

显然,一个可能的替代方法是设置最大维度(基于QSplitter方向),但这不是完全相同的事情。

如果拆分器中的所有小部件都具有最大大小(包括只存在一个小部件的情况),则结果是拆分器将根据这些小部件具有最大大小,这取决于(或“以上”)其布局中的其他小部件,但是如果拆分器是顶级窗口,那么当它调整到大于其子部件的最大大小时,仍将保留一些空白空间。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68025665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档