PyQt5 QGridLayout布局中提交与取消按钮等列宽设置问题
问题原因
你现有代码的布局存在两个核心问题:
- 单元格跨度设置冲突:用户名/密码标签设置了从第0列开始跨2列,但是对应的输入框又从第1列开始放置,出现了组件重叠的情况,布局计算逻辑混乱
- 按钮所在列没有设置相同的宽度规则:两个按钮分别占1列,Qt默认会根据按钮文本长度自动分配列宽,导致宽度不一致
解决方案
提供两种常用实现方式,按需选择即可:
方式1:调整网格布局的单元格规则(直接修改现有网格逻辑)
修正单元格跨度,为按钮所在列设置相同的拉伸因子,修改后完整代码如下:
from PyQt5 import QtWidgets as qtw import sys class MainWindow(qtw.QWidget): def __init__(self, *arg, **kwargs): super().__init__(*arg, **kwargs) username_label = qtw.QLabel('Username') password_label = qtw.QLabel('Password') username_input = qtw.QLineEdit() password_input = qtw.QLineEdit(echoMode = qtw.QLineEdit.Password) cancel_button = qtw.QPushButton('Cancel') submit_button = qtw.QPushButton('Login') layout = qtw.QGridLayout() # 前两行布局:标签占1列,输入框占3列,无重叠 layout.addWidget(username_label, 0, 0, 1, 1) layout.addWidget(username_input, 0, 1, 1, 3) layout.addWidget(password_label, 1, 0, 1, 1) layout.addWidget(password_input, 1, 1, 1, 3) # 按钮行:每个按钮占2列,总宽度和上一行的4列对齐 layout.addWidget(cancel_button, 2, 0, 1, 2) layout.addWidget(submit_button, 2, 2, 1, 2) # 给所有列设置相同的拉伸因子,保证同占比宽度 for col in range(4): layout.setColumnStretch(col, 1) self.setLayout(layout) self.show() if __name__ == '__main__': app = qtw.QApplication(sys.argv) w = MainWindow() sys.exit(app.exec_())
方式2:嵌套水平布局放按钮(更灵活,后续调整按钮逻辑更方便)
把两个按钮放到水平布局容器里,再把容器整体加到网格布局的最后一行,按钮会自动平分宽度:
from PyQt5 import QtWidgets as qtw import sys class MainWindow(qtw.QWidget): def __init__(self, *arg, **kwargs): super().__init__(*arg, **kwargs) username_label = qtw.QLabel('Username') password_label = qtw.QLabel('Password') username_input = qtw.QLineEdit() password_input = qtw.QLineEdit(echoMode = qtw.QLineEdit.Password) cancel_button = qtw.QPushButton('Cancel') submit_button = qtw.QPushButton('Login') layout = qtw.QGridLayout() layout.addWidget(username_label, 0, 0, 1, 1) layout.addWidget(username_input, 0, 1, 1, 3) layout.addWidget(password_label, 1, 0, 1, 1) layout.addWidget(password_input, 1, 1, 1, 3) # 嵌套水平布局放按钮 btn_layout = qtw.QHBoxLayout() btn_layout.addWidget(cancel_button, stretch=1) btn_layout.addWidget(submit_button, stretch=1) # 把按钮布局加到网格最后一行,跨4列 layout.addLayout(btn_layout, 2, 0, 1, 4) self.setLayout(layout) self.show() if __name__ == '__main__': app = qtw.QApplication(sys.argv) w = MainWindow() sys.exit(app.exec_())
两种方式都可以实现两个按钮等宽的预期效果,窗口拉伸时也会保持等宽比例。
内容的提问来源于stack exchange,提问作者Himanshu Poddar
相关产品推荐
相关产品推荐

