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使用reportlab实现图片转换成pdf的方法
May 22 Python
python logging 日志轮转文件不删除问题的解决方法
Aug 02 Python
Python如何判断数独是否合法
Sep 08 Python
Python中shape计算矩阵的方法示例
Apr 21 Python
DataFrame 将某列数据转为数组的方法
Apr 13 Python
Python实现求解括号匹配问题的方法
Apr 17 Python
Python3实现获取图片文字里中文的方法分析
Dec 13 Python
Python实现二叉树的常见遍历操作总结【7种方法】
Mar 06 Python
python 计算一个字符串中所有数字的和实例
Jun 11 Python
django自定义非主键自增字段类型详解(auto increment field)
Mar 30 Python
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
Jun 29 Python
Python实现学生管理系统并生成exe可执行文件详解流程
Jan 22 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里面的抽象类
2010/01/28 PHP
一个漂亮的php验证码类(分享)
2013/08/06 PHP
PHP学习笔记(一) 简单了解PHP
2014/08/04 PHP
PHP实现将浏览历史页面网址保存到cookie的方法
2015/01/26 PHP
PHP实现的策略模式简单示例
2017/08/25 PHP
基于PHP实现堆排序原理及实例详解
2020/06/19 PHP
编写跨浏览器的javascript代码必备[js多浏览器兼容写法]
2008/10/29 Javascript
jQuery实现contains方法不区分大小写的方法
2015/02/13 Javascript
javascript实现简单的二级联动
2015/03/19 Javascript
基于HTML模板和JSON数据的JavaScript交互(移动端)
2016/04/06 Javascript
jQuery Easyui 验证两次密码输入是否相等
2016/05/13 Javascript
JavaScript正则表达式的贪婪匹配和非贪婪匹配
2017/09/05 Javascript
web前端vue实现插值文本和输出原始html
2018/01/19 Javascript
js消除图片小游戏代码
2019/12/11 Javascript
JavaScript事件委托实现原理及优点进行
2020/08/29 Javascript
vue 如何使用递归组件
2020/10/23 Javascript
ant design vue 表格table 默认勾选几项的操作
2020/10/31 Javascript
[06:25]DOTA2英雄梦之声_第17期_大地之灵
2014/06/20 DOTA
Python中声明只包含一个元素的元组数据方法
2014/08/25 Python
在Python的Flask框架中使用日期和时间的教程
2015/04/21 Python
Python中的descriptor描述器简明使用指南
2016/06/02 Python
Python 使用with上下文实现计时功能
2018/03/09 Python
解决Python2.7读写文件中的中文乱码问题
2018/04/12 Python
如何用Python实现简单的Markdown转换器
2018/07/16 Python
python爬虫开发之urllib模块详细使用方法与实例全解
2020/03/09 Python
pycharm永久激活超详细教程
2020/10/29 Python
解决margin 外边距合并问题
2019/07/03 HTML / CSS
html5绘制时钟动画
2014/12/15 HTML / CSS
Rowdy Gentleman服装和配饰:美好时光
2019/09/24 全球购物
销售业务实习自我鉴定
2013/09/23 职场文书
小学生开学感言
2014/02/28 职场文书
工作会议方案
2014/05/21 职场文书
社保转移委托书范本
2014/10/08 职场文书
幼儿园小班见习报告
2014/10/31 职场文书
2019年鼓励无偿献血倡议书
2019/09/17 职场文书
python中的class_static的@classmethod的巧妙用法
2021/06/22 Python