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


Posted in Python onSeptember 04, 2021

背景:

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

示例如下:

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

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

# -*- 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_())

最终效果:

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

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

 总结:

这里我用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多个类组合在界面显示内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python中的Matplotlib模块入门教程
Apr 15 Python
python使用paramiko实现远程拷贝文件的方法
Apr 18 Python
Python的collections模块中的OrderedDict有序字典
Jul 07 Python
python 2.6.6升级到python 2.7.x版本的方法
Oct 09 Python
基于使用paramiko执行远程linux主机命令(详解)
Oct 16 Python
Python决策树分类算法学习
Dec 22 Python
python的格式化输出(format,%)实例详解
Jun 01 Python
python读取xlsx的方法
Dec 25 Python
Python基于WordCloud制作词云图
Nov 29 Python
python实现IOU计算案例
Apr 12 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
Oct 15 Python
python 实现一个图形界面的汇率计算器
Nov 09 Python
一小时学会TensorFlow2之基本操作2实例代码
Python torch.flatten()函数案例详解
Aug 30 #Python
Python之基础函数案例详解
Aug 30 #Python
python中使用 unittest.TestCase单元测试的用例详解
Aug 30 #Python
python使用matplotlib绘制图片时x轴的刻度处理
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
Aug 30 #Python
OpenCV绘制圆端矩形的示例代码
Aug 30 #Python
You might like
探讨Hessian在PHP中的使用分析
2013/06/13 PHP
PHP+mysql+ajax轻量级聊天室实现方法详解
2016/10/17 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
2018/08/15 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
PHP设计模式之命令模式示例详解
2020/12/20 PHP
extjs fckeditor集成代码
2009/05/10 Javascript
使用js对select动态添加和删除OPTION示例代码
2013/08/12 Javascript
node.js中的fs.fsyncSync方法使用说明
2014/12/15 Javascript
JS实现新浪微博效果带遮罩层的弹出框代码
2015/10/12 Javascript
javascript实现保留两位小数的多种方法
2015/12/18 Javascript
jquery.validate提示错误信息位置方法
2016/01/22 Javascript
你不需要jQuery(三) 新AJAX方法fetch()
2016/06/14 Javascript
解决BootStrap Fileinput手机图片上传显示旋转问题
2017/06/01 Javascript
vue2.0开发入门笔记之.vue文件的生成和使用
2017/09/19 Javascript
使用vuex缓存数据并优化自己的vuex-cache
2018/05/30 Javascript
详解Vue+axios+Node+express实现文件上传(用户头像上传)
2018/08/10 Javascript
Jquery滑动门/tab切换实现方法完整示例
2020/06/05 jQuery
vue form表单post请求结合Servlet实现文件上传功能
2021/01/22 Vue.js
Python的SQLAlchemy框架使用入门
2015/04/29 Python
Python爬取数据并写入MySQL数据库的实例
2018/06/21 Python
python numpy 按行归一化的实例
2019/01/21 Python
django celery redis使用具体实践
2019/04/08 Python
如何使用Python实现斐波那契数列
2019/07/02 Python
Django获取model中的字段名和字段的verbose_name方式
2020/05/19 Python
Python如何测试stdout输出
2020/08/10 Python
容易被忽略的Python内置类型
2020/09/03 Python
python实现文件+参数发送request的实例代码
2021/01/05 Python
Stuarts London美国/加拿大:世界领先的独立男装零售商之一
2019/03/18 全球购物
车辆工程专业求职信
2014/04/28 职场文书
室内趣味活动方案
2014/08/24 职场文书
软环境建设心得体会
2014/09/09 职场文书
检讨书大全
2015/01/27 职场文书
个人年度总结报告
2015/03/09 职场文书
2015年小学图书室工作总结
2015/05/18 职场文书
关于空气污染危害的感想
2015/08/11 职场文书
vue.js Router中嵌套路由的实用示例
2021/06/27 Vue.js