我们之前写的代码耦合性比较高,复用性不高,这是面向过程编程的缺点。我们可以把程序基本结构设计成面向对象的版本,把 设置控件
这部分内容封装到一个类中。
比如这个是我们的窗口,红色的矩形是相同的菜单控件,既然是一模一样的,那我们就给他给抽取出来,当成一个类,方便复用。如果需要修改这个菜单控件的话,我们只需要在类里面修改代码,不用在具体的GUI文件中修改代码。
原来的面向过程代码如下:
# -*- coding: UTF-8 -*-
# 0.导入需要的包
from PyQt5.Qt import *
import sys
# 0.导入需要的包
from PyQt5.Qt import *
import sys
# 1、创建一个应用程序对象
app = QApplication(sys.argv) # app自己创建的当前文件的局部变量
# 2、控件的操作
# 1、创建控件
window = QWidget() # 创建一个空白窗口
# 2、设置控件
window.setWindowTitle("封装菜单栏的学习") # 设置窗口标题
window.resize(500, 500) # 设置窗口大小
label = QLabel(window) # 创建标签子控件
label.setText("xxxx") # 设置标签文本
# 3、展示控件
window.show() # 将窗口展示出来
# 3、开始执行应用程序,并进入消息循环
sys.exit(app.exec_())
我们可以把 设置控件
这部分内容抽象出来,封装成一个Window
类,这个类继承 QWidget
父类,设置样式和子控件的代码全部封装在Window
类的初始化方法中,封装的Window类如下:
class Window(QWidget): # 创建一个类,并且继承QWidget这个父类,用来自定义样式
def __init__(self):
super().__init__() # 调用父类的初始化方法(因为子类重写了init方法,所以父类的被隐藏了,需要显示调用)
self.setWindowTitle("封装菜单栏的学习") # 设置子类的标题
self.resize(500, 500) # 设置子类的窗口大小
self.setup_ui()
def setup_ui(self): # 增加子控件
label = QLabel(self)
label.setText("xxxx")
我们把设置子控件的代码封装在一个实例方法中,初始化方法单独放设置样式的代码,想添加子控件的时候,只需在初始化方法中调用setup_ui
实例方法即可。
面向对象的程序结构如下:
# -*- coding: UTF-8 -*-
# 0.导入需要的包
from PyQt5.Qt import *
import sys
from Menu import Window
# 1、创建一个应用程序对象
app = QApplication(sys.argv) # app自己创建的当前文件的局部变量
# 2、控件的操作
# 1、创建控件
window = Window() # 创建一个空白窗口
# 2、设置控件
# 3、展示控件
window.show() # 将窗口展示出来
# 3、开始执行应用程序,并进入消息循环
sys.exit(app.exec_())
根据这种思想,我们还可以对其他的控件结构进行封装,此处不在过多说明。