前言
使用面向对象过程编程,让代码重用,逻辑更清晰,更容易维护。在PyQt5编程中,随着项目复杂度的增加,面向过程的编程方式往往会显得力不从心。代码冗余、难以维护、重用性差等问题逐渐浮现。为了解决这些问题,我们通常会采用面向对象的方式来重构我们的程序。本文将通过一个简单的例子,介绍如何将一个面向过程的PyQt5程序转换成面向对象的版本。
1.1 面向过程的PyQt5程序
在面向过程的PyQt5程序的基本结构中,直接操作控件,并将它们的创建和配置代码散布在程序的各个角落。这样的代码结构虽然简单明了,但当控件数量增多时,代码会迅速变得冗长和难以管理。例如,假设我们需要创建一个窗口,并在其中添加多个控件,代码可能会是这样的:
# 1、导入要用的模块
from PyQt5.Qt import *
import sys
# 2、创建应用,并接收命令行参数
app = QApplication(sys.argv)
# 3、创建窗口
window = QWidget()
window.setWindowTitle('梯阅线条-总结是一种习惯')
window.resize(500, 300)
window.move(900, 300)
# 4、创建控件
label1 = QLabel(window)
label1.setText('label1')
# 中间省略很多控件
button1 = QPushButton('button1', window)
button1.setGeometry(10, 10, 80, 30)
button1.move(200, 130)
# 5、显示窗口
window.show()
# 6、执行应用,进入消息循环
# 并将退出状态传给退出命令
sys.exit(app.exec_())
1.2 面向对象的PyQt5程序
采用面向对象的方式来重构面向过程的程序,不仅可以提高代码的重用性,还可以使代码更加清晰和易于维护。
1.2.1 定义类
定义一个窗口类继承自QWidget,并包含窗口的初始化方法以及控件的创建和配置方法。
1.2.2 测试代码
在main条件进行测试定义的类及方法,避免模块被其他地方导入时被执行。
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
1.2.3 面向对象代码
将创建和配置控件都放在类的初始化,并且将子控件的创建和配置封装为实例方法。这样,每当创建Window对象时,init方法就会自动被调用,从而完成控件的初始化。修改后的面向对象代码,Menus.py如下。
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('梯阅线条-总结是一种习惯')
self.resize(500, 300)
self.move(900, 300)
self.set_ui()
def set_ui(self):
label = QLabel(self)
label.setText('label')
button = QPushButton('button', self)
button.setGeometry(10, 10, 80, 30)
button.move(200, 130)
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
1.2.4 使用类
在其他模块(testpyqt5.py)导入面向对象的类,进行使用。
from PyQt5.Qt import *
from Menus import Window
import sys
if __name__ == '__main__':
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
1.2.5 测试结果
不管是在测试代码还是在其他模块导入后使用面向对象的类,执行都生效。
1.3 使用活动模板
在PyQt5编程中,我们还可以使用活动模板来快速生成面向对象的代码结构。活动模板允许我们定义一个简短的字符串来代表一段复杂的代码。使用活动模板不仅可以提高我们的编程效率,还可以确保代码的一致性和可读性。配置参考《Win11设置Pycharm的python活动模板》。
from PyQt5.Qt import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('$TITLE$')
self.resize(500, 300)
self.move(900, 300)
self.set_ui()
def set_ui(self):
$CODE$
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())