您当前的位置:首页 > IT编程 > python
| C语言 | Java | VB | VC | python | Android | TensorFlow | C++ | oracle | 学术与代码 | cnn卷积神经网络 | gnn | 图像修复 | Keras | 数据集 | Neo4j | 自然语言处理 | 深度学习 | 医学CAD | 医学影像 | 超参数 | pointnet | pytorch | 异常检测 | Transformers | 情感分类 | 知识图谱 |

自学教程:Pyqt5将多个类组合在一个界面显示的完整示例

51自学网 2021-10-30 22:14:11
  python
这篇教程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)

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

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


一小时学会TensorFlow2之基本操作2实例代码
python读取mnist数据集方法案例详解
万事OK自学网:51自学网_软件自学网_CAD自学网自学excel、自学PS、自学CAD、自学C语言、自学css3实例,是一个通过网络自主学习工作技能的自学平台,网友喜欢的软件自学网站。