Python Qt GUI设计入门模板类的单继承和多继承封装

Posted 肆拾伍

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python Qt GUI设计入门模板类的单继承和多继承封装相关的知识,希望对你有一定的参考价值。


前言

在上一章讲过,通过Qt Creator 自动生成的py文件是一个模板类,不能直接运行,需要外部导入调用,这章我们来讲讲如何使用这个模板类比较好。


一、回顾原始代码

我们来回顾一下原始的代码,分析一下它的内部逻辑。

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'HelloForm.ui'
#
# Created by: PyQt5 UI code generator 5.15.4
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets
import sys

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(400, 300)
        self.label = QtWidgets.QLabel(Form)
        self.label.setGeometry(QtCore.QRect(140, 110, 111, 16))
        self.label.setObjectName("label")
        self.pushButton = QtWidgets.QPushButton(Form)
        self.pushButton.setGeometry(QtCore.QRect(140, 150, 92, 28))
        self.pushButton.setObjectName("pushButton")

        self.retranslateUi(Form)
        QtCo# re.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Form"))
        self.label.setText(_translate("Form", "Hello World"))
        self.pushButton.setText(_translate("Form", "Close"))
# 生成了一个新的类,名字为UI_Form,这个类具有一个setupUi方法可以实现我们想要的GUI界面
# 但是调用这个方法的条件是输入一个Form参数,是Qwidget 类,然后这个函数就会来修饰Qwidget类
# 把它变成GUI的载体
app = QtWidgets.QApplication(sys.argv)
baseW = QtWidgets.QWidget()
ui = Ui_Form()
ui.setupUi(baseW)
baseW.show()
sys.exit(app.exec_())

这个操作有点像把Ui_Form看成一个加工工具,输入一个全新的Qwidget,会产生一个做好的Qwidget。但是这样会使整个程序是面向过程的,所有对GUI的控制都需要Ui_Form来完成,包括后面我们要添加的逻辑处理模块,而我们期待的是把Ui_Form看成一个模板,不做过多的改动,这就要对其进行二次封装。

二、单继承

单继承方法较为常用,也便于大家理解,代码如下:

class QmyWidget(QWidget):
    def __init__(self):
        super(QmyWidget, self).__init__() # 调用父类的初始化
        # super().__init__() 与上面等价
        self.__ui = Ui_Form()
        self.__ui.setupUi(self)
        self.Lab = '单继承'
        self.__ui.label.setText(self.Lab)
    def setLabel(self,text):
        self.__ui.label.setText(text)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    myWidget = QmyWidget()
    myWidget.show()
    myWidget.setLabel('方法转换')
    sys.exit(app.exec_())
# 这段代码的含义是定义了一个父类是QWidget的子类,那么子类就拥有所有父类的属性
# 这也说明它也可以作为之前的Ui_Form的setupUi函数的输入参数
# 那么我们可以重写它的构造函数,__ui是它的私有属性,也即Ui_Form类
# 把自己作为输入参数,在自身初始化的时候就直接完成了GUI的生成,即每个
# QmyWidget对象就是一个完整的GUI,无需在后面再次调用setupUi加工

在这里插入图片描述

这段代码既可以放在模板下面,也可以作为单独的一个py文件,只需import 之前的模板文件。

三、多继承

代码如下:

import sys
from PyQt5.QtWidgets import QWidget,QApplication
from ui_Form import Ui_Form

class QmyWidget(QWidget,Ui_Form):
	def __init__(self):
		super().__init__()
		self.Lab = '多继承'
		self.setupUi(self)
		self.label.setText(self.Lab)

if __name__ == "__main__":
	app = QApplication(sys.argv)
	myWidget = QmyWidget()
	myWidget.show()
	sys.exit(app.exec_())

效果和上面单继承一样


总结

直接得到的py文件再次加以封装会更有利于后续的编程,可以使用多继承和单继承,但是单继承较为简单,逻辑清晰,在以后的代码中都会默认使用单继承。

以上是关于Python Qt GUI设计入门模板类的单继承和多继承封装的主要内容,如果未能解决你的问题,请参考以下文章

Python Qt GUI设计入门

Python Qt GUI设计入门自建信号与槽函数关联

Python Qt GUI设计入门PyQt5 的资源调用

Python Qt GUI设计入门PyQt5 的资源调用

Python--类的继承和多态

Python Qt GUI设计:QPushButtonQRadioButton和QCheckBox按钮类(基础篇—12)