pyqt5-编写示例
1、ui创建
pyqt的ui创建形式,实际有大约四种:
- 直接编写,调用pyqt组件类创建组件对象
- 创建类继承pyqt组件类,调用自定义类创建对象
- designer创建.ui文件,用工具转译成.py文件,然后调用其创建对象
- designer创建.ui文件,loadUi函数加载,解析出组件对象
从自己长期开发来看,如果不过分追求运行效率,第四种形式是最实用的。
- designer快速设计和更改,尤其方便布局管理
- 组件的部分属性直接在ui文件中设置,节省代码。(当然,也会占用运行资源进行解析)
- 一定程度的ui和业务分离,便于迭代和开发
2、简单示例
ui文件是designer设计保存的结果,采用xml语法,其内定义了组件与组件对象的层次关系、组件的类型和名称,组件的一些属性。
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.uic import loadUi
"""
启动程序
"""
class my_window:
def __init__(self):
self.window = loadUi('ui/widget.ui')
self.window: QWidget
self.window.show()
self.window.pushButton: QPushButton
self.window.pushButton.clicked.connect(self.test)
def test(self):
pass
if __name__ == "__main__":
app = QApplication([])
w = my_window()
sys.exit(app.exec_())
3、项目开发
(1)核心要则
- designer设计、loadUi加载,实现ui显示和代码逻辑分离
- 不同功能的ui相互之间分离,独立为窗口和对应的ui文件,以缩小变量名规模,方便迭代和复用。
- 将代码中与ui不相关部分抽离,单独编写,尽量压缩ui相关代码,增加通用逻辑代码,以方便复用
- 对一些ui的复杂操作,也可以抽取定义为类和函数,方便复用。比如文本域组件的标记和搜索操作、表格组件的初始化和添加项等
(2)ui结构
- 启动,main.py
- 开始窗口,StartWindowClass.py。用于设置本次运行工作空间
- 主窗口,HomeWindowClass.py。其内用tab组件容纳其它功能窗口
- 功能窗口
- 其它窗口
(3)项目结构
- ui目录,存放.ui文件
- windows目录,存放各ui窗口的py文件
- api目录,通用业务逻辑代码
- config目录,存放项目的全局配置文件
- output目录,默认的用于存放各工作空间目录的父目录
- pyqt_api目录,pyqt相关的、自定义复用模块
- main.py文件,项目的启动入口
4、main.py
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from windows.HomeWindowClass import HomeWindow
from windows.StartWindowClass import StartWindow
"""
程序启动
"""
class my_window:
def __init__(self):
self.window = StartWindow()
# 将当前对象的init_home方法绑定到StartWindow对象的ok_next_fun属性,以方便StartWindow对象调用init_home方法
self.window.ok_next_fun = self.init_home
self.home_window = None
def init_home(self):
# 初始化主窗口
self.home_window = HomeWindow()
# 关闭开始窗口
self.window.window: QWidget
self.window.window.close()
# 删除开始窗口对象,以节约资源
del self.window
if __name__ == "__main__":
app = QApplication([])
w = my_window()
sys.exit(app.exec_())