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实现简单多线程任务队列
Feb 27 Python
Python缩进和冒号详解
Jun 01 Python
Python3实现发送QQ邮件功能(附件)
Dec 23 Python
Python装饰器原理与用法分析
Apr 30 Python
解决Python print 输出文本显示 gbk 编码错误问题
Jul 13 Python
python实现坦克大战游戏 附详细注释
Mar 27 Python
Django框架下静态模板的继承操作示例
Nov 08 Python
Python字符串的修改方法实例
Dec 19 Python
python通过文本在一个图中画多条线的实例
Feb 21 Python
离线状态下在jupyter notebook中使用plotly实例
Apr 24 Python
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
May 17 Python
Python趣味实战之手把手教你实现举牌小人生成器
Jun 07 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
php部分常见问题总结
2008/03/27 PHP
一段好玩的JavaScript代码
2006/12/01 Javascript
轻轻松松学JS调试(不下载任何工具)
2010/04/14 Javascript
高亮显示web页表格行的javascript代码
2010/11/19 Javascript
js设置cookie过期及清除浏览器对应名称的cookie
2013/10/24 Javascript
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
深入探究使JavaScript动画流畅的一些方法
2015/06/30 Javascript
javascript设计模式之模块模式学习笔记
2017/02/15 Javascript
HTML5+Canvas调用手机拍照功能实现图片上传(上)
2017/04/21 Javascript
微信小程序 生命周期函数详解
2017/05/24 Javascript
Vue插件从封装到发布的完整步骤记录
2019/02/28 Javascript
vue父组件触发事件改变子组件的值的方法实例详解
2019/05/07 Javascript
简单了解JavaScript中常见的反模式
2019/06/21 Javascript
基于layui框架响应式布局的一些使用详解
2019/09/16 Javascript
jQuery与原生JavaScript选择HTML元素集合用法对比分析
2019/11/26 jQuery
原生js实现随机点名
2020/07/05 Javascript
js canvas实现俄罗斯方块
2020/10/11 Javascript
微信小程序实现弹幕墙(祝福墙)
2020/11/18 Javascript
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
python实现哈希表
2014/02/07 Python
在Python中用split()方法分割字符串的使用介绍
2015/05/20 Python
pygame实现弹力球及其变速效果
2017/07/03 Python
Pipenv一键搭建python虚拟环境的方法
2018/05/22 Python
python dict 相同key 合并value的实例
2019/01/21 Python
Python通过TensorFlow卷积神经网络实现猫狗识别
2019/03/14 Python
Python3离线安装Requests模块问题
2019/10/13 Python
Python下应用opencv 实现人脸检测功能
2019/10/24 Python
利用Python校准本地时间的方法教程
2019/10/31 Python
python函数enumerate,operator和Counter使用技巧实例小结
2020/02/22 Python
python删除文件、清空目录的实现方法
2020/09/23 Python
python 监控服务器是否有人远程登录(详细思路+代码)
2020/12/18 Python
突袭HTML5之Javascript API扩展2—地理信息服务及地理位置API学习
2013/01/31 HTML / CSS
个人找工作自荐信格式
2013/09/21 职场文书
银行实习人员自我鉴定
2013/09/22 职场文书
致百米运动员广播稿5篇
2014/10/13 职场文书
关于k8s环境部署mysql主从的问题
2022/03/13 MySQL