python - 调整 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_()
布局与拆分器:
解决方案
问题在于您过早地设置了拉伸因子。
setStretchFactor()
如果在尚不存在的小部件索引上完成,则将被忽略(请参阅其实现的源代码);- QSplitter 根据其大小策略调整小部件比例;size policy 还包括水平和垂直拉伸因子,并且无论何时再次使用 basic 设置它们都会重置为 0 默认值
setSizePolicy(horizontalPolicy, verticalPolicy)
(这意味着您可以在 QSizePolicy 中指定拉伸,这与 using 相同setStretchFactor
)。
解决方案很简单:在添加小部件并设置它们的策略后setStretchFactor
移动线条。
显然,一种可能的替代方法是设置最大尺寸(基于 QSplitter 方向),但这并不完全相同。
如果拆分器中的所有小部件都具有最大尺寸(包括仅存在一个小部件的情况),则结果是拆分器将具有基于这些小部件的最大尺寸,具体取决于其布局中(或“上方”)的其他小部件,但如果拆分器是顶级窗口,那么每当它被调整到大于其子级[ren]的最大值时,就会有一些空白空间。
推荐阅读
- wcf - WCF 服务无法调用另一台机器上的服务
- c# - 保存图像并检索它们 Xamarin iOS
- python - 如何使用请求库发布到本地主机?
- javascript - Javascript - 使用 lambda 按日期分组对象数组
- c++ - 将只移动函数参数传递给 boost::thread 构造函数
- azure - terraform / azure 上的奇怪错误“缺少必需的参数”
- php - 如何在 php 中回显图像以引导轮播?
- react-native - 当应用程序在前台运行时,Reactnative codepush 不检查更新
- java - url.openConnection().getInputStream() 似乎没有连接到 php
- vb.net - VB.NET - 以编程方式调用 ContextMenu 项单击以进行 WebBrowser 控件