[英]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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.