pyqt5-编写示例

发布时间 2023-07-02 01:53:23作者: 挖洞404

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