PyQt5面向对象的程序基本结构

前言

使用面向对象过程编程,让代码重用,逻辑更清晰,更容易维护。

在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 测试结果

不管是在测试代码还是在其他模块导入后使用面向对象的类,执行都生效。

PyQt5面向对象的程序基本结构

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_())