4 - 面向对象版本的PyQt

4 - 面向对象版本的PyQt

1、PyCharm 活动模板设置

活动模板:通过一个简短的字符串和某一段代码,把代码块关联起来。可以键入字符串,从而自动补全代码块。

image-20210909142910055

选择语言,在右侧点击 + ,选择 Live Template,填写底部内容。其中,Template text 内容如下:

# 0.导入包和模块
from PyQt5.Qt import *
import sys

# 1.创建应用程序对象
app = QApplication(sys.argv)

# 2.1 创建控件
window = QWidget()

# 2.2 设置控件
window.setWindowTitle("$TITLE$")
window.resize(500, 500)
$CODE$

# 2.3 展示控件
window.show()

# 3.进入消息循环
sys.exit(app.exec_())

定位到某一位置:$TITLE$

美元符号之间的是变量,引入活动模板后,光标会自动定位到这里。

image-20210909143931276

点击 Define 会定义活动模板所适用的环境,勾选 Python。

image-20210909144141048

设置好后,【Apply】-【OK】

自此,输入 qtt 回车就会出现自己设置的活动模板,并把光标自动放置在需要修改的地方,写好后回车到下一处。

2、面向对象版本代码

面向过程的缺点:

  • 代码冗余量大
  • 修改某控件查找麻烦
继承的提出

创建面向对象不能瞎改原本的类,可以考虑通过继承来实现:

# 0.导入包和模块
from PyQt5.Qt import *
import sys


# 继承类、定义自己的方法
class Window(QWidget):
    def __init__(self):
        print("继承类")


# 1.创建应用程序对象
app = QApplication(sys.argv)

# 2.1 创建控件
window = Window()

# 2.2 设置控件
window.setWindowTitle("用了继承类")
window.resize(500, 500)

# 2.3 展示控件
window.show()

# 3.进入消息循环
sys.exit(app.exec_())

运行报错:父类的 init() 方法没有被调用。

image-20210909153247107

错误原因:当我们用 window = QWidget() 方法去创建控件时,会自动调用系统提供给我们的 QWidget 的 init 方法。但在继承过程中,重新写了 init 方法,导致创建对象时,会自动先调用子类 init 方法,而子类 init 方法没有调用父类 init 方法里的准备操作。

解决方法:在子类的 init 方法里首先调用父类的 init 方法,即不是替换而是在原基础上增加自己的配置。修改后的类继承如下:

# 继承类、定义自己的方法
class Window(QWidget):
    def __init__(self):
        # super后自动补全后面的内容
        super(Window, self).__init__()
        print("继承类")

运行结果:

image-20210909154914318

输出了”继承类“这三个字还有原来那个窗口。

同理,可以把菜单栏的控件相关配置全都塞到继承类里面去(就像 print 语句)。

类的封装

self:通过 Window 类创建出来的实例对象。

# 继承类、定义自己的方法
class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()
        self.setWindowTitle("面向对象")
        self.resize(500, 500)

        label = QLabel(self)
        label.setText("标签签")

把子控件的添加单独列到一个方法里面去。

# 继承类、定义自己的方法
class Window(QWidget):
    # 初始化
    def __init__(self):
        super(Window, self).__init__()
        self.setWindowTitle("面向对象")
        self.resize(500, 500)
        self.setup_ui()

    # 存放所有子控件以及子控件的配置操作
    def setup_ui(self):
        label = QLabel(self)
        label.setText("标签签")

从功能层面与刚刚的写法并无区别,但从结构来说这个更清晰。

再进一步,把导入的包和继承的类放在另一个 python 文件 Menu.py (注意该文件名称得是英语)中,然后如下一句话就可以导入类。

from Menu import Window

这样,通过类增强了代码的可维护性,有问题直接改这个类,其他地方统统不需要动。

类的测试

如果需要去测试类的功能是否正常,直接在 Menu.py 文件中加上测试代码就行。

import sys
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())

但该测试部分在被导入时是不需要执行的,这时候就用到了

 if __name__ == '__main__': 

它帮助我们的测试代码只有在右键运行时才会执行,而在被导入其他 python 文件时不需要执行。

同样的,可以把它设置为活动模板。

image-20210909171257732

别忘了 Define 选择 Python!!!!!!!

PS:写代码时输入 main 自动补全:

【File】-【Settings】-【Editor】-【Live Templates】,在 python 处打勾。

image-20210909140643313


参考博客:

pycharm 输入 main 自动补全:https://blog.csdn.net/migming/article/details/109978585

作话:活动模板真方便,我居然现在才知道ORZ。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值