PyQt5 GUI程序的基本结构
Qt GUI程序最好以面向对象的形式来写,面向对象的优势这里就不啰嗦了,还有一个原因是QtDesigner设计的UI文件转成python文件后,也是以类的形式组织的
Qt GUI 程序的大致结构像下面这样:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel
class MyWindow(QMainWindow):
def __init__(self):
# 调用父类的构造方法
super().__init__()
# 调用构建子控件的方法
self.setup_ui()
def setup_ui(self):
"负责构建子控件"
# 创建一个标签对象
label = QLabel(self)
# 设置标签展示的文本
label.setText("Hello World")
if __name__ == "__mian__":
# 实例化一个QApplication对象
app = QApplication(sys.argv)
# 实例化自定义的窗口类
win = MyWindow()
# 展示窗口
win.show()
# 启动事件循环,并将退出码传递给系统退出方法
sys.exit(app.exec_())
一些应该了解的额外知识
关于QApplication
app = QApplication(sys.argv)
这里实例化了一个QApplication对象
这个对象就像一个幕后工作者,主要作用有:
- 根据系统桌面环境初始化一些参数,比如字体,色彩等等,并能够跟踪系统参数的改变
- 开启事件循环,将事件循环中的事件分发给对应的接受者(对应的控件)
- 接收命令行参数(sys.argv),根据其设置应用的运行方式
- 定义应用的外观,并能够在运行时更改
- 提供国际化解决方案
- 提供对一些神奇的工具的使用(比如桌面,剪贴板等等)
- 能够集体操控应用内的所有窗口(比如关闭所有窗口closeAllWindows())
- 处理鼠标指针
关于QMainWindow
class MyWindow(QMainWindow):
这里我们定制了一个继承自QMainWindow的类
在老师的课程里,一直是让MyWindow类继承自QWidget类的
实际上QWidget只不过是一个空白的矩形控件而已
当一个控件没有父控件时,系统会自动为它添加标题栏和边框,使它成为一个顶层窗口
但是它也仅仅拥有这两样东西而已
QMainWindow则不同,它是一个专门作为顶层窗口使用的类
除了系统自动添加的标题栏和边框之外,QMainWindow还拥有菜单栏,工具栏,状态栏等区域
这里引用一个官网的图片:
正因为它功能齐全,所以我习惯用它
关于控件的展示
win.show()
这行代码是让窗口控件展示出来,也就是绘制在屏幕上,让用户看到
在Qt中,一个没有父控件的控件,是不会自动展示的,需要调用show()方法(或者类似的方法)来展示
如果一个控件有父控件,默认情况下,它会随着父控件的展示而展示(除非它本身设置了隐藏)
换句话说,一个控件展示的时候,会将它的非隐藏的子控件一起展示出来
所以这里仅仅win调用了show()方法,而label并没有调用show()方法
关于结束程序
sys.exit(app.exec_())
这里app.exec_()会开启一个事件循环,负责扫描事件队列中的消息
当程序的顶层窗口被关闭时(或者程序退出时),此方法返回程序的退出码,0为正常退出,非0则为异常退出
然后再将退出码传递给python系统的退出方法,即汇报退出状态
关于编码风格
之前我学习的时候都是使用IDLE的,最近学习PyQt5,因为老师使用的是pycharm,所以我也跟着用了
用了之后才发现,真的比IDLE好用太多,而且它也会提示一些编码风格的问题(根据PEP8),比如
- 导入语句与下面的类之间要留两个空行
- 函数或方法之间要留一个空行
- 所有成员变量应该在初始化函数中定义
- 方法名应该小写
- 写完最后一行应该按下回车,并将缩进删除(删到光标顶在行首)
曾经去粗略浏览了一下PEP8的网站,条目太多了,实在没有耐心看下去,像现在这样根据pycharm的提示来修改代码也挺不错的,目前只发现了这些问题,也许以后还有更多
关于本文
本文是橙子的学习笔记,学习的是王顺子老师的PyQt5视频课程,在网易云课堂买的,把老师课上讲的知识点结合官网的讲解,汇总到一起再发出来,希望能够给新人们一些参考,不过因为橙子还是小白一个,所以难免会有很多错误和不足,还请各路大神不吝赐教,谢谢啦!(人参第一帖完成,撒花!!)