4 - 面向对象版本的PyQt
1、PyCharm 活动模板设置
活动模板:通过一个简短的字符串和某一段代码,把代码块关联起来。可以键入字符串,从而自动补全代码块。
选择语言,在右侧点击 + ,选择 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$
美元符号之间的是变量,引入活动模板后,光标会自动定位到这里。
点击 Define 会定义活动模板所适用的环境,勾选 Python。
设置好后,【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() 方法没有被调用。
错误原因:当我们用 window = QWidget() 方法去创建控件时,会自动调用系统提供给我们的 QWidget 的 init 方法。但在继承过程中,重新写了 init 方法,导致创建对象时,会自动先调用子类 init 方法,而子类 init 方法没有调用父类 init 方法里的准备操作。
解决方法:在子类的 init 方法里首先调用父类的 init 方法,即不是替换而是在原基础上增加自己的配置。修改后的类继承如下:
# 继承类、定义自己的方法
class Window(QWidget):
def __init__(self):
# super后自动补全后面的内容
super(Window, self).__init__()
print("继承类")
运行结果:
输出了”继承类“这三个字还有原来那个窗口。
同理,可以把菜单栏的控件相关配置全都塞到继承类里面去(就像 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 文件时不需要执行。
同样的,可以把它设置为活动模板。
别忘了 Define 选择 Python!!!!!!!
PS:写代码时输入 main 自动补全:
【File】-【Settings】-【Editor】-【Live Templates】,在 python 处打勾。
参考博客:
pycharm 输入 main 自动补全:https://blog.csdn.net/migming/article/details/109978585
作话:活动模板真方便,我居然现在才知道ORZ。