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中基础的socket编程实战攻略
Jun 01 Python
python2.7+selenium2实现淘宝滑块自动认证功能
Feb 24 Python
Django csrf 两种方法设置form的实例
Feb 03 Python
对python多线程SSH登录并发脚本详解
Feb 14 Python
Python中的正则表达式与JSON数据交换格式
Jul 03 Python
使用python将excel数据导入数据库过程详解
Aug 27 Python
使用 Python 处理3万多条数据只要几秒钟
Jan 19 Python
Python各种扩展名区别点整理
Feb 27 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
Dec 31 Python
python爬虫今日热榜数据到txt文件的源码
Feb 23 Python
python编写扎金花小程序的实例代码
Feb 23 Python
解决Pytorch中关于model.eval的问题
May 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
是否存在第一台收音机的说法
2021/03/01 无线电
PHP中的extract的作用分析
2008/04/09 PHP
php.ini修改php上传文件大小限制的方法详解
2013/06/17 PHP
php ckeditor上传图片文件名乱码解决方法
2013/11/15 PHP
详细对比php中类继承和接口继承
2018/10/11 PHP
php设计模式之适配器模式实例分析【星际争霸游戏案例】
2020/04/07 PHP
测试JavaScript字符串处理性能的代码
2009/12/07 Javascript
JavaScript QueryString解析类代码
2010/01/17 Javascript
原生JS实现加入收藏夹的代码
2013/10/24 Javascript
javascript判断图片是否加载完成的方法推荐
2016/05/13 Javascript
JS比较两个数值的大小实例
2016/11/25 Javascript
js微信支付实现代码
2016/12/22 Javascript
谈谈第三方App接入微信登录 解读
2016/12/27 Javascript
vue轮播图插件vue-awesome-swiper的使用代码实例
2017/07/10 Javascript
JavaScript对JSON数据进行排序和搜索
2017/07/24 Javascript
原生js实现弹窗消息动画
2020/11/20 Javascript
Python读取视频的两种方法(imageio和cv2)
2018/04/15 Python
详解python爬虫系列之初识爬虫
2019/04/06 Python
python中pygame安装过程(超级详细)
2019/08/04 Python
利用matplotlib为图片上添加触发事件进行交互
2020/04/23 Python
AmazeUI 折叠面板的实现代码
2020/08/17 HTML / CSS
印度婴儿用品在线商店:Firstcry.com
2016/12/05 全球购物
Rakuten Kobo台湾:电子书、eReaders和Reading应用程式
2017/11/24 全球购物
博士生入学考试推荐信
2013/11/17 职场文书
写自荐信的注意事项
2014/03/09 职场文书
幼儿园新年寄语
2014/04/03 职场文书
关于学习的演讲稿
2014/05/10 职场文书
公共艺术专业自荐信
2014/09/01 职场文书
高校教师个人工作总结2014
2014/12/17 职场文书
2015年留守儿童工作总结
2015/05/22 职场文书
幼儿园大班开学寄语(2015秋季)
2015/05/27 职场文书
大学生奶茶店创业计划书
2019/06/25 职场文书
2020年元旦晚会策划书模板
2019/12/30 职场文书
端午节将至,用Python爬取粽子数据并可视化,看看网友喜欢哪种粽子吧!
2021/06/11 Python
详解PyTorch模型保存与加载
2022/04/28 Python
zabbix如何添加监控主机和自定义监控项
2022/08/14 Servers