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的Flask框架中Flask-Admin库的简单入门指引
Apr 07 Python
Linux下用Python脚本监控目录变化代码分享
May 21 Python
python创建列表并给列表赋初始值的方法
Jul 28 Python
python+Django+apache的配置方法详解
Jun 01 Python
python文件特定行插入和替换实例详解
Jul 12 Python
python微信跳一跳系列之棋子定位像素遍历
Feb 26 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
Jan 24 Python
python实现大学人员管理系统
Oct 25 Python
python Manager 之dict KeyError问题的解决
Dec 21 Python
python字典通过值反查键的实现(简洁写法)
Sep 30 Python
手把手教你配置JupyterLab 环境的实现
Feb 02 Python
pandas取dataframe特定行列的实现方法
May 24 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 $_SERVER["REQUEST_URI"]获取值的通用解决方法
2010/06/21 PHP
CentOS7编译安装php7.1的教程详解
2019/04/18 PHP
JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)
2009/11/04 Javascript
2010年最佳jQuery插件整理
2010/12/06 Javascript
jQuery.each()用法分享
2012/07/31 Javascript
javascript文本框内输入文字倒计数的方法
2015/02/24 Javascript
微信小程序页面跳转功能之从列表的item项跳转到下一个页面的方法
2017/11/27 Javascript
vue自定义switch开关组件,实现样式可自行更改
2019/11/01 Javascript
mpvue微信小程序开发之实现一个弹幕评论
2019/11/24 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
js对象属性名驼峰式转下划线的实例代码
2020/09/17 Javascript
基于ajax实现上传图片代码示例解析
2020/12/03 Javascript
浅谈Python 中整型对象的存储问题
2016/05/16 Python
python中Switch/Case实现的示例代码
2017/11/09 Python
Python模拟随机游走图形效果示例
2018/02/06 Python
Python网络编程基于多线程实现多用户全双工聊天功能示例
2018/04/10 Python
tensorflow实现加载mnist数据集
2018/09/08 Python
Python中Selenium库使用教程详解
2020/07/23 Python
Python 利用flask搭建一个共享服务器的步骤
2020/12/05 Python
python 实现图片裁剪小工具
2021/02/02 Python
英国最大的在线奢侈手表零售商:Jura Watches
2018/01/29 全球购物
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
Tommy Hilfiger澳洲官网:美国高端休闲领导品牌
2020/12/16 全球购物
世界上最大的皮肤科医生拥有和经营的美容网站:LovelySkin
2021/01/03 全球购物
介绍一下JNDI的基本概念
2013/07/26 面试题
介绍一下XMLHttpRequest对象的常用方法和属性
2013/05/24 面试题
房地产出纳岗位职责
2013/12/01 职场文书
社会治安综合治理管理责任书
2014/04/16 职场文书
自主招生教师推荐信
2014/05/10 职场文书
家庭贫困证明
2014/09/23 职场文书
故宫英文导游词
2015/01/31 职场文书
2015医德医风个人工作总结
2015/04/02 职场文书
雷锋的观后感
2015/06/10 职场文书
2015年财务人员个人工作总结
2015/07/27 职场文书
母亲节主题班会
2015/08/14 职场文书
2019公司借款合同范本2篇!
2019/07/24 职场文书