千家信息网

Pyqt5如何将多个类组合在一个界面显示

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,这篇文章将为大家详细讲解有关Pyqt5如何将多个类组合在一个界面显示,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。背景:当你做复杂程序的时候,一个python文件不
千家信息网最后更新 2025年01月19日Pyqt5如何将多个类组合在一个界面显示

这篇文章将为大家详细讲解有关Pyqt5如何将多个类组合在一个界面显示,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

背景:

当你做复杂程序的时候,一个python文件不可能写完所有UI,所以我们需要分块组合,在不同的类写多个UI文件及其相应的逻辑,然后再组合在一个UI界面中。

示例如下:

1、待组合的原始主界面,主要使用控件是QTabWidget ,将不同类中的布局显示到相应tab中

# -*- coding: utf-8 -*- import sysfrom PyQt5 import QtCore, QtGui, QtWidgetsfrom PyQt5.QtWidgets import QApplication class Ui_MainWindow(QtWidgets.QWidget):    def __init__(self):        super(Ui_MainWindow,self).__init__()        self.setupUi()     def setupUi(self):        self.allLayoutV = QtWidgets.QVBoxLayout()        self.allLayoutV.setContentsMargins(0, 0, 0, 0)        self.allLayoutV.setObjectName("allLayoutV")        self.tabWidget = QtWidgets.QTabWidget()        self.tabWidget.setObjectName("tabWidget")        self.tab = QtWidgets.QWidget()          self.tab.setObjectName("tab")        self.tabWidget.addTab(self.tab, "")        self.tab_2 = QtWidgets.QWidget()        self.tab_2.setObjectName("tab_2")        self.tabWidget.addTab(self.tab_2, "")        self.tab_3 = QtWidgets.QWidget()        self.tab_3.setObjectName("tab_3")        self.tabWidget.addTab(self.tab_3, "")        self.allLayoutV.addWidget(self.tabWidget)         self.retranslateUi()        self.tabWidget.setCurrentIndex(0)        self.setLayout(self.allLayoutV)        self.show()     def retranslateUi(self):        _translate = QtCore.QCoreApplication.translate        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Tab 1"))        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab 2"))        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "Tab 3")) if __name__ == '__main__':    app = QApplication(sys.argv)    ex = Ui_MainWindow()    app.exit(app.exec_())

分界面1

class Test(QtWidgets.QWidget):    def __init__(self, parent=None):        super(Test, self).__init__(parent)        # for testing        lay = QtWidgets.QVBoxLayout(self)        lay.addWidget(QtWidgets.QPushButton("Test"))

分界面2

class Train_Haar(QtWidgets.QWidget):    def __init__(self, parent=None):        super(Train_Haar, self).__init__(parent)        # for testing        lay = QtWidgets.QVBoxLayout(self)        lay.addWidget(QtWidgets.QPushButton("Train_Haar"))

分界面3

class Train_HOG(QtWidgets.QWidget):    def __init__(self, parent=None):        super(Train_HOG, self).__init__(parent)        # for testing        lay = QtWidgets.QVBoxLayout(self)        lay.addWidget(QtWidgets.QPushButton("Train_HOG"))

组合类最终代码

# -*- coding: utf-8 -*- import sysfrom PyQt5 import QtCore, QtGui, QtWidgetsfrom PyQt5.QtWidgets import QApplication# 界面1class Test(QtWidgets.QWidget):    def __init__(self, parent=None):        super(Test, self).__init__(parent)        # for testing        lay = QtWidgets.QVBoxLayout(self)        lay.addWidget(QtWidgets.QPushButton("Test")) # 界面2class Train_Haar(QtWidgets.QWidget):    def __init__(self, parent=None):        super(Train_Haar, self).__init__(parent)        # for testing        lay = QtWidgets.QVBoxLayout(self)        lay.addWidget(QtWidgets.QPushButton("Train_Haar")) # 界面3class Train_HOG(QtWidgets.QWidget):    def __init__(self, parent=None):        super(Train_HOG, self).__init__(parent)        # for testing        lay = QtWidgets.QVBoxLayout(self)        lay.addWidget(QtWidgets.QPushButton("Train_HOG")) class Ui_MainWindow(QtWidgets.QWidget):    def __init__(self):        super(Ui_MainWindow,self).__init__()        self.setupUi()     def setupUi(self):        self.allLayoutV = QtWidgets.QVBoxLayout()        self.allLayoutV.setContentsMargins(0, 0, 0, 0)        self.allLayoutV.setObjectName("allLayoutV")        self.tabWidget = QtWidgets.QTabWidget()        self.tabWidget.setObjectName("tabWidget")                # tab1 示例一        self.tab = QtWidgets.QWidget()        self.tab.setObjectName("tab")        # 创建Test类对象        test = Test()        # 创建一个临时布局,用于存放从Test中获取的布局及其逻辑        lay = QtWidgets.QGridLayout()        # 获取Test类中的布局及其逻辑        ''' 注意这里一定要用addWeidget方法,如果直接赋值布局的话self.tab.setLayout(test.layout()) 只能得到Test中的布局            但在Test中写的控件逻辑是不会被调用的,因为直接赋值你只获取的是布局        '''        lay.addWidget(test)        # 将临时布局设定到tab上        self.tab.setLayout(lay)        self.tabWidget.addTab(self.tab, "")         # tab2 示例二        self.tab_2 = QtWidgets.QWidget()        self.tab_2.setObjectName("tab_2")        train_Haar = Train_Haar()        lay = QtWidgets.QGridLayout()        lay.addWidget(train_Haar)        self.tab_2.setLayout(lay)        self.tabWidget.addTab(self.tab_2, "")                # tab3 示例三        self.tab_3 = QtWidgets.QWidget()        self.tab_3.setObjectName("tab_3")        train_Hog = Train_HOG()        lay = QtWidgets.QGridLayout()        lay.addWidget(train_Hog)        self.tab_3.setLayout(lay)        self.tabWidget.addTab(self.tab_3, "")        self.allLayoutV.addWidget(self.tabWidget)         self.retranslateUi()        self.tabWidget.setCurrentIndex(0)        self.setLayout(self.allLayoutV)        self.show()     def retranslateUi(self):        _translate = QtCore.QCoreApplication.translate        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Tab 1"))        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Tab 2"))        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "Tab 3")) if __name__ == '__main__':    app = QApplication(sys.argv)    ex = Ui_MainWindow()    app.exit(app.exec_())

最终效果:

总结:

这里我用QTabWidget,其实可以使用任何布局,关键代码在于addWidget,所以你可以用QGridLayout等其他布局容器都行。

  # tab1        self.tab = QtWidgets.QWidget()        self.tab.setObjectName("tab")        # 创建Test类对象        test = Test()        # 创建一个临时布局,用于存放从Test中获取的布局及其逻辑        lay = QtWidgets.QGridLayout()        # 获取Test类中的布局及其逻辑        ''' 注意这里一定要用addWeidget方法,如果直接赋值布局的话self.tab.setLayout(test.layout()) 只能得到Test中的布局            但在Test中写的控件逻辑是不会被调用的,因为直接赋值你只获取的是布局        '''        lay.addWidget(test)        # 将临时布局设定到tab上        self.tab.setLayout(lay)

关于"Pyqt5如何将多个类组合在一个界面显示"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

0