PyQt5如何实现放置QLabel的子布局与按钮子布局高度一致
问题根源
你设置的网格布局行拉伸因子逻辑是正确的,问题出在QPushButton默认的垂直大小策略为QSizePolicy.Preferred,自带最大高度限制,不会自动拉伸填满布局分配的高度,导致按钮所在行看起来高度远小于QLabel所在行。另外原代码中直接把自定义方法命名为layout会覆盖QWidget内置的layout()方法,可能引发隐性异常。
修复方案
只需修改控件的大小策略,让按钮可以垂直填充分配的布局空间即可,修改后代码如下:
import sys from PyQt5 import QtCore from PyQt5.QtWidgets import QWidget, QApplication, QHBoxLayout, QLabel, QPushButton, QGridLayout, QSizePolicy class Window(QWidget): def __init__(self): super().__init__() self.setGeometry(100, 50, 400, 300) self.setWindowTitle("Fretboard Note Quiz") self.setup_layout() self.show() def setup_layout(self): glay = QGridLayout() self.setLayout(glay) hbox1 = QHBoxLayout() # 上方Label布局 hbox2 = QHBoxLayout() # 下方按钮布局 btn1 = QPushButton("1") btn2 = QPushButton("2") btn3 = QPushButton("3") # 设置按钮垂直大小策略为可扩展,允许填满布局高度 btn1.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) btn2.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) btn3.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) hbox2.addWidget(btn1) hbox2.addWidget(btn2) hbox2.addWidget(btn3) label = QLabel("Text") # 可选:设置Label居中对齐,显示效果更友好 label.setAlignment(QtCore.Qt.AlignCenter) hbox1.addWidget(label) glay.addLayout(hbox1, 0, 0) glay.addLayout(hbox2, 1, 0) # 两行拉伸比例1:1,保证高度相等 glay.setRowStretch(0, 1) glay.setRowStretch(1, 1) if __name__ == "__main__": app = QApplication(sys.argv) win = Window() sys.exit(app.exec_())
补充说明
如果你不希望按钮被拉伸变形,也可以保持按钮原有尺寸,只需给按钮布局设置垂直居中对齐即可,此时两个布局分配到的高度依然是相等的,只是按钮不会填满整行:
# 替换按钮大小策略的设置,改为设置布局对齐 hbox2.setAlignment(QtCore.Qt.AlignVCenter)
如果使用QVBoxLayout实现,逻辑完全一致,添加两个子布局时分别设置拉伸因子为1即可,不需要修改其他逻辑。
内容的提问来源于stack exchange,提问作者Karlkaesque
相关产品推荐
相关产品推荐

