繁体   English   中英

PyQt5:具有相同列宽的布局按钮

[英]PyQt5 : layout buttons with equal column width

我正在使用 PyQt5 为我的用户名、密码 label 和输入字段以及我的提交和取消按钮创建网格布局。

我为我的所有小部件添加了相等的行宽 1,但是对于我的取消和提交按钮,我希望它们具有相同的单元格宽度。

这是我尝试过的

from PyQt5 import QtWidgets as qtw
from PyQt5 import QtCore as qtc
from PyQt5 import QtGui as qtg
import sys

class MainWindow(qtw.QWidget):
    
    def __init__(self, *arg, **kwargs):
        super().__init__(*arg, **kwargs)
        # custom code goes here
        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, 2) # 0,0 cell, rowspan : 1, colSpan : 2
        layout.addWidget(username_input, 0, 1, 1, 3) # 0, 1 cell
        layout.addWidget(password_label, 1, 0, 1, 2) # 1, 0 cell
        layout.addWidget(password_input, 1, 1, 1, 3) # 1, 1 cell
        layout.addWidget(cancel_button, 2, 0, 1)
        layout.addWidget(submit_button, 2, 1, 1)

        self.setLayout(layout)
        self.show()

if __name__ == '__main__':
    app = qtw.QApplication(sys.argv)
    w = MainWindow()
    sys.exit(app.exec_())

然而,这给了我

在此处输入图像描述

正如我所料,取消并登录以具有相等的宽度。

在此处输入图像描述

您需要为按钮创建单独的布局,以便它们可以独立于其他小部件调整大小。 此外,重叠小部件的问题可以通过使用默认的行/列跨度来解决。 我还添加了一个可拉伸的垫片,以便在调整 window 的大小时按钮保持在底部。

    cancel_button = qtw.QPushButton('Cancel')
    submit_button = qtw.QPushButton('Login')

    hbox = qtw.QHBoxLayout()
    hbox.addWidget(cancel_button)
    hbox.addWidget(submit_button)

    layout = qtw.QGridLayout()
    layout.addWidget(username_label,0, 0)
    layout.addWidget(username_input, 0, 1)
    layout.addWidget(password_label, 1, 0)
    layout.addWidget(password_input, 1, 1)
    layout.setRowStretch(2, 1)
    layout.addLayout(hbox, 3, 0, 1, 2)

    self.setLayout(layout)

默认:

在此处输入图像描述

调整大小:

在此处输入图像描述

首先,您使用的列跨度 arguments 是错误的:跨度表示小部件将从指示的行或列开始扩展多少个单元格。

如果将 label 添加到第 0 列,跨度为 2,行编辑到第 1 列,跨度为 3,结果将是 label 将占据前两列,而行编辑从第二到第四,结果行编辑将与 label 重叠。 由于您的布局不需要任何跨越,您可以完全避免跨越 arguments 。

如果您希望底部按钮占据一半宽度,无论上面的小部件的大小如何,那么您需要使用嵌套的水平布局:

        layout = qtw.QGridLayout()
        layout.addWidget(username_label,0, 0)
        layout.addWidget(username_input, 0, 1)
        layout.addWidget(password_label, 1, 0)
        layout.addWidget(password_input, 1, 1)
        buttonLayout = qtw.QHBoxLayout()
        layout.addLayout(buttonLayout, 2, 0, 1, 2)
        buttonLayout.addWidget(cancel_button)
        buttonLayout.addWidget(submit_button)

理论上,按钮应该自动扩展,但这可能取决于当前的操作系统/样式提示,因此您最终可以通过设置Expanding大小策略来“强制”它们:

        cancel_button.setSizePolicy(qtw.QSizePolicy.Expanding, 
            qtw.QSizePolicy.Fixed)
        submit_button.setSizePolicy(qtw.QSizePolicy.Expanding, 
            qtw.QSizePolicy.Fixed)

修改添加按钮的行:

layout.addWidget(cancel_button, 2, 0, 1, 1)
layout.addWidget(submit_button, 2, 1, 1, 1)

将它们设置到适当的位置:

在此处输入图像描述

我的环境:

  • KDE 等离子
  • Python 3.8.2
  • PyQt5 5.15.1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM