Qt中如何在控件间添加随窗口动态拉伸的均匀间距
Qt 控件间动态可拉伸均匀间距实现
要实现窗口缩放时间隙自动适配、控件在可用空间内均匀排布的效果,直接用Qt布局自带的拉伸占位项即可,效果参考如下:
实现逻辑
QBoxLayout(QVBoxLayout/QHBoxLayout的父类)的addStretch(stretchFactor)方法会在布局中插入一个可自动伸缩的空白占位项:
- 所有插入的stretch拉伸因子数值相等时,布局的多余空白会被这些占位项平均分配
- 窗口尺寸变化时,每个stretch的尺寸会同步按比例调整,自动适配可用空间
你之前的代码只在所有控件末尾加了1个stretch,所以全部多余空白都挤在最后一个控件下方,控件全部堆在布局顶部,达不到均匀分布的效果。
修改方法
如果要实现参考图里「控件和布局上下边缘有留白、控件之间间隙均匀拉伸」的效果:
- 插入第一个控件前,先加1个拉伸因子为1的stretch
- 每插入一个控件后,都加1个拉伸因子为1的stretch
- 10个控件总共会插入11个等因子stretch,所有间隙自动平分空白
如果不需要边缘留白、只需要控件之间有拉伸间隙,只需要在两个控件之间插入等因子stretch即可,10个控件插9个。
可直接运行的修改后代码
#!/usr/bin/python3 import sys import random try: from PySide6 import QtCore, QtWidgets except ModuleNotFoundError: from PySide2 import QtCore, QtWidgets class MyWidget(QtWidgets.QWidget): def __init__(self): super().__init__() self.layout = QtWidgets.QVBoxLayout(self) # 按需调整布局整体的边缘边距 self.layout.setContentsMargins(20, 20, 20, 20) # 第一个控件前插入拉伸项 self.layout.addStretch(1) for i in range(0, 10): text_label = QtWidgets.QLabel("Hello World", alignment=QtCore.Qt.AlignCenter, styleSheet = f''' background-color: '#999999'; color : '#000000'; ''' ) # 固定控件高度,避免控件被拉伸变形,匹配参考图效果;需要控件本身拉伸就删掉这行 text_label.setFixedHeight(30) self.layout.addWidget(text_label) # 每个控件后插入等系数拉伸项 self.layout.addStretch(1) if __name__ == "__main__": app = QtWidgets.QApplication([]) widget = MyWidget() widget.resize(800, 600) widget.show() sys.exit(app.exec_())
补充说明
addStretch()传入的参数是拉伸因子,只要所有stretch的因子值相等就会平分空白,数值本身大小不影响等比分配效果- 如果需要某段间隙宽度是其他间隙的2倍,只需要把对应位置stretch的因子改成2即可
- 这个方法对水平布局
QHBoxLayout同样生效,逻辑完全一致
内容的提问来源于stack exchange,提问作者caveman
相关产品推荐
相关产品推荐

