You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PyQt5 QGridLayout布局中提交与取消按钮等列宽设置问题

问题原因

你现有代码的布局存在两个核心问题:

  1. 单元格跨度设置冲突:用户名/密码标签设置了从第0列开始跨2列,但是对应的输入框又从第1列开始放置,出现了组件重叠的情况,布局计算逻辑混乱
  2. 按钮所在列没有设置相同的宽度规则:两个按钮分别占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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 02:27:04