• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    Pyqt5将多个类组合在一个界面显示的完整示例

    背景:

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

    示例如下:

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

    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    from 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 sys
    from PyQt5 import QtCore, QtGui, QtWidgets
    from PyQt5.QtWidgets import QApplication
    # 界面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"))
     
    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)

    参考:python - Compose a PyQt5 UI from multiple classes - Stack Overflow

    到此这篇关于Pyqt5将多个类组合在一个界面显示的文章就介绍到这了,更多相关Pyqt5多个类组合在界面显示内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    上一篇:一小时学会TensorFlow2之基本操作2实例代码
    下一篇:python读取mnist数据集方法案例详解
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    Pyqt5将多个类组合在一个界面显示的完整示例 Pyqt5,将,多个,类组,合在,