[英]PyQt5 Different Grids on Different Tabs
我正在嘗試設計一個具有兩個選項卡的GUI界面,兩個選項卡都具有自己的網格。 但是,我得到這個GUI外觀。
這是我的代碼:
class Ui_MainWindow(QMainWindow):
def __init__(self):
super(Ui_MainWindow, self).__init__()
self.setupUi()
def generate_pstest_tab_elements(self,str1):
groupBox = QGroupBox(str1)
label1 = QLabel(self)
label1.setText('Serial No:')
line1 = QLineEdit(self)
line1.setText("XXXX")
label2 = QLabel(self)
label2.setText('Chip ID:')
line2 = QLineEdit(self)
line2.setText("XXXX")
rd_group = QButtonGroup()
rdbtn_FCB15 = QRadioButton("FCB-15")
rdbtn_DCB15 = QRadioButton("DCB-15")
rd_group.addButton(rdbtn_FCB15)
rd_group.addButton(rdbtn_FCB15)
layout1 = QFormLayout()
layout1.addRow(label1,line1)
layout1.addRow(label2,line2)
layout1.addRow(rdbtn_FCB15,rdbtn_DCB15)
grid1 = QGridLayout()
grid1.addWidget(label1,0,0)
grid1.addWidget(line1,0,1)
grid1.addWidget(rdbtn_FCB15,0,2)
grid1.addWidget(rdbtn_DCB15,0,3)
grid1.addWidget(label2,1,0)
grid1.addWidget(line2,1,1)
groupBox.setLayout(grid1)
return groupBox
def generate_pscalib_tab_elements(self,str1):
groupBox = QGroupBox(str1)
label1 = QLabel(self)
label1.setText('Serial No:')
line1 = QLineEdit(self)
line1.setText("XXXX")
label2 = QLabel(self)
label2.setText('Chip ID:')
line2 = QLineEdit(self)
line2.setText("XXXX")
label3 = QLabel(self)
label3.setText('QR Code:')
line3 = QLineEdit(self)
line3.setText("XXXX")
label4 = QLabel(self)
label4.setText('Current Range:')
line4 = QLineEdit(self)
line4.setText("1.0")
label5 = QLabel(self)
label5.setText("PS Offset")
line5 = QLineEdit(self)
line5.setText("0.0")
line5.setReadOnly(True)
label6 = QLabel()
label6.setText("PSGain")
line6 = QLineEdit(self)
line6.setText("1.0")
line6.setReadOnly(True)
grid2 = QGridLayout()
grid2.addWidget(label1,0,0)
grid2.addWidget(line1,0,1)
grid2.addWidget(label2,1,0)
grid2.addWidget(line2,1,1)
grid2.addWidget(label3,2,0)
grid2.addWidget(line3,2,1)
grid2.addWidget(label4,3,0)
grid2.addWidget(line4,3,1)
grid2.addWidget(label5,4,0)
grid2.addWidget(line5,4,1)
grid2.addWidget(label6,5,0)
grid2.addWidget(line6,5,1)
groupBox.setLayout(grid2)
return groupBox
def setupUi(self):
self.title = 'BiPolar Power Supply Testing'
self.setWindowTitle(self.title)
print (self.title)
self.left = 50
self.top = 50
self.width = 1000
self.height = 800
self.PSTestTabGrid = QGridLayout()
self.PSCalibTabGrid = QGridLayout()
#self.setGeometry(self.left, self.top, self.width, self.height)
#Create one main box that will hold all the tabs
self.mainbox = QFormLayout()
##################### Items for PS Functional Test Tab #################
self.PSTestTabGrid.addWidget(self.generate_pstest_tab_elements("PS1"), 0,0)
self.PSTestTabGrid.addWidget(self.generate_pstest_tab_elements("PS2"), 1,0)
self.PSTestTabGrid.addWidget(self.generate_pstest_tab_elements("PS3"), 2,0)
self.PSTestTabGrid.addWidget(self.generate_pstest_tab_elements("PS4"), 3,0)
self.PSTestTabGrid.addWidget(self.generate_pstest_tab_elements("PS5"), 4,0)
self.PSTestTabGrid.addWidget(self.generate_pstest_tab_elements("PS6"), 5,0)
self.PSTestTabGrid.addWidget(self.generate_pstest_tab_elements("PS7"), 6,0)
self.PSTestTabGrid.addWidget(self.generate_pstest_tab_elements("PS8"), 7,0)
self.PSFStart_btn = QPushButton("Start",self)
self.PSFStop_btn = QPushButton("Stop",self)
self.PSTestTabGrid.addWidget(self.PSFStart_btn,8,0)
self.PSTestTabGrid.addWidget(self.PSFStop_btn,9,0)
##################### Items for PS Calib Tab #################
self.PSCalibTabGrid.addWidget(self.generate_pscalib_tab_elements("PS"), 0,0)
self.PSCalibStart_btn = QPushButton("Calib Start",self)
self.PSCalibStop_btn = QPushButton("Calib Stop",self)
self.PSCalibTabGrid.addWidget(self.PSCalibStart_btn,1,0)
self.PSCalibTabGrid.addWidget(self.PSCalibStop_btn,2,0)
######################################################################
#Init Tab Screen
self.tabs = QTabWidget()
self.tab1 = QWidget()
self.tab2 = QWidget()
#Add Tab
self.tabs.addTab(self.tab1, "PS Tests")
self.tabs.addTab(self.tab2, "PS Calib")
#Set Layout for tab1, tab2
self.tab1.setLayout(self.PSTestTabGrid)
self.tab2.setLayout(self.PSCalibTabGrid)
#Add the Tabs widget to MainBox
self.mainbox.addWidget(self.tabs)
#self.mainbox.addRow(self.tab2HBox)
self.wid = QWidget(self)
self.setCentralWidget(self.wid)
#layout = QtGui.QVBoxLayout()
self.wid.setLayout(self.mainbox)
從SetupUi()調用兩個函數。
Tab2上不同小部件之間的間距非常大。 我嘗試調用setVerticalSpacing()來縮小垂直間距,但也不會縮小。
但是,如果我贊揚Tab1項,使得Tab1不包含任何小部件,則Tab2項看起來不錯。 看來Qt是如何在兩個獨立的Grid之間混淆的?
附件是兩個選項卡的快照。
Tab1圖片
Tab2圖片
每個選項卡采用顯示的上一個選項卡的大小,如果顯示第一個選項卡,則將使用可用的大小,如果您希望采用最小的大小,則必須在最后使用QVBoxLayout建立拉伸。
考慮到上述情況,解決方案是:
from PyQt5 import QtCore, QtGui, QtWidgets
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("BiPolar Power Supply Testing")
tab_widget = QtWidgets.QTabWidget()
self.setCentralWidget(tab_widget)
pstest_widget = QtWidgets.QWidget()
tab_widget.addTab(pstest_widget, "PS Tests")
pstest_vlay = QtWidgets.QVBoxLayout(pstest_widget)
for i in range(1, 9):
title = "PS{}".format(i)
group_box = MainWindow.create_pstest_element(title)
pstest_vlay.addWidget(group_box)
self.PSFStart_btn = QtWidgets.QPushButton("Start")
self.PSFStop_btn = QtWidgets.QPushButton("Stop")
pstest_vlay.addWidget(self.PSFStart_btn)
pstest_vlay.addWidget(self.PSFStop_btn)
pstest_vlay.addStretch()
pscalib_widget = QtWidgets.QWidget()
tab_widget.addTab(pscalib_widget, "PS Calib")
pscalib_vlay = QtWidgets.QVBoxLayout(pscalib_widget)
group_box = MainWindow.create_pscalib_element("PS")
self.PSCalibStart_btn = QtWidgets.QPushButton("Calib Start")
self.PSCalibStop_btn = QtWidgets.QPushButton("Calib Stop")
pscalib_vlay.addWidget(group_box)
pscalib_vlay.addWidget(self.PSCalibStart_btn)
pscalib_vlay.addWidget(self.PSCalibStop_btn)
pscalib_vlay.addStretch()
@staticmethod
def create_pstest_element(title):
group_box = QtWidgets.QGroupBox(title)
grid = QtWidgets.QGridLayout()
group_box.setLayout(grid)
serial_label = QtWidgets.QLabel("Serial No:")
serial_lineedit = QtWidgets.QLineEdit("XXXX")
chipid_label = QtWidgets.QLabel("Chip ID:")
chipid_lineedit = QtWidgets.QLineEdit("XXXX")
rd_group = QtWidgets.QButtonGroup()
rdbtn_FCB15 = QtWidgets.QRadioButton("FCB-15")
rdbtn_DCB15 = QtWidgets.QRadioButton("DCB-15")
grid.addWidget(serial_label, 0, 0)
grid.addWidget(serial_lineedit, 0, 1)
grid.addWidget(rdbtn_FCB15, 0, 2)
grid.addWidget(rdbtn_DCB15, 0, 3)
grid.addWidget(chipid_label, 1, 0)
grid.addWidget(chipid_lineedit, 1, 1)
return group_box
@staticmethod
def create_pscalib_element(title):
group_box = QtWidgets.QGroupBox(title)
flay = QtWidgets.QFormLayout()
group_box.setLayout(flay)
serial_lineedit = QtWidgets.QLineEdit("XXXX")
chipid_lineedit = QtWidgets.QLineEdit("XXXX")
qrcode_lineedit = QtWidgets.QLineEdit("XXXX")
range_lineedit = QtWidgets.QLineEdit("1.0")
offset_lineedit = QtWidgets.QLineEdit("0.0", readOnly=True)
gain_lineedit = QtWidgets.QLineEdit("1.0", readOnly=True)
flay.addRow("Serial No:", serial_lineedit)
flay.addRow("Chip ID:", chipid_lineedit)
flay.addRow("QR Code:", qrcode_lineedit)
flay.addRow("Current Range:", range_lineedit)
flay.addRow("PS Offset:", offset_lineedit)
flay.addRow("PS Gain:", gain_lineedit)
return group_box
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
如果要繼續使用QGridLayout,則解決方案是將其放在QVBoxLayout中:
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("BiPolar Power Supply Testing")
tab_widget = QtWidgets.QTabWidget()
self.setCentralWidget(tab_widget)
pstest_widget = QtWidgets.QWidget()
tab_widget.addTab(pstest_widget, "PS Tests")
grid_lay_1 = QtWidgets.QGridLayout(pstest_widget)
pstest_vlay = QtWidgets.QVBoxLayout()
grid_lay_1.addLayout(pstest_vlay, 0, 0)
for i in range(1, 9):
title = "PS{}".format(i)
group_box = MainWindow.create_pstest_element(title)
pstest_vlay.addWidget(group_box)
self.PSFStart_btn = QtWidgets.QPushButton("Start")
self.PSFStop_btn = QtWidgets.QPushButton("Stop")
pstest_vlay.addWidget(self.PSFStart_btn)
pstest_vlay.addWidget(self.PSFStop_btn)
pstest_vlay.addStretch()
pscalib_widget = QtWidgets.QWidget()
tab_widget.addTab(pscalib_widget, "PS Calib")
grid_lay_2 = QtWidgets.QGridLayout(pscalib_widget)
pscalib_vlay = QtWidgets.QVBoxLayout()
grid_lay_2.addLayout(pscalib_vlay, 0, 0)
group_box = MainWindow.create_pscalib_element("PS")
self.PSCalibStart_btn = QtWidgets.QPushButton("Calib Start")
self.PSCalibStop_btn = QtWidgets.QPushButton("Calib Stop")
pscalib_vlay.addWidget(group_box)
pscalib_vlay.addWidget(self.PSCalibStart_btn)
pscalib_vlay.addWidget(self.PSCalibStop_btn)
pscalib_vlay.addStretch()
# ...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.