PyQt5不同选项卡上的不同网格

2024-06-28 16:01:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图设计一个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()调用。你知道吗

  1. 第一个函数是通过调用generate \u pstest \u tab \u elements()为Tab1生成布局
  2. 第二个函数是通过调用generate \u pscalib \u tab \u elements()为Tab2生成布局

Tab2上不同小部件之间的间距非常大。我试图调用setVerticalSpacing()来缩小垂直间距,但它也没有缩小。你知道吗

但是,如果我删除了Tab1项,使得Tab1不包含任何小部件,那么Tab2项看起来就可以了。 似乎Qt是两个独立的网格之间的一些混淆?你知道吗

附件是两个选项卡的快照。你知道吗

Tab1图像

Tab2图像


Tags: selfelementstabgeneratesettextlabel1btnaddwidget
1条回答
网友
1楼 · 发布于 2024-06-28 16:01:12

每个选项卡采用上一个显示的选项卡的大小,如果显示第一个选项卡,则将使用可用的大小,如果希望采用最小的大小,则必须使用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()
    # ...

相关问题 更多 >