簡體   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