【问题标题】:PyQt5 Different Grids on Different TabsPyQt5 不同选项卡上的不同网格
【发布时间】:2019-11-26 23:48:58
【问题描述】:

我正在尝试设计一个具有两个选项卡的 GUI 界面,两个选项卡都有自己的网格。但是,我得到了这个 GUI Look;

这是我的代码:

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_pstest_tab_elements() 为 Tab1 生成布局
  2. 第二个函数是通过调用 generate_pscalib_tab_elements() 为 Tab2 生成生成器布局

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

但是,如果我注释掉 Tab1 项,使得 Tab1 不包含任何小部件,则 Tab2 项看起来很好。 看起来 Qt 在这两个独立的 Grid 之间有些混乱?

附件是两个标签的快照。

Tab1 图片

Tab2 图片

【问题讨论】:

    标签: python pyqt pyqt5


    【解决方案1】:

    每个选项卡都采用显示的前一个选项卡的大小,并且在显示的第一个选项卡的情况下,将使用可用大小,如果您想要采用最小的尺寸,那么您必须在最后使用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()
        # ...
    

    【讨论】:

    • 您好,感谢您的回复。其实我更喜欢使用 QGridlayout 方法而不是 QVBoxLayout。您能否建议在这种情况下需要对代码进行哪些修改?
    • 您好,非常感谢您的帮助。
    • 您能否分享一下,如何读取/写入单个小部件,例如,如果我想读取 PS1 serial_lineedit 文本并存储在变量中,例如text = PS1.serial_lineedit?
    猜你喜欢
    • 2023-03-28
    • 1970-01-01
    • 2021-04-03
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    相关资源
    最近更新 更多