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设计:QPushButtonQRadioButton和QCheckBox按钮类(基础篇—12)