pyqt5-开发
1、介绍
这里介绍pyqt的一般开发过程。
pyqt的开发模式实际有多种,大致有:
- 一般类中直接创建GUI对象,进行使用
- 继承GUI类,进行使用
- 通过designer设计ui,保存为ui文件,然后转为py文件,相当于新的GUI类被使用
- 通过designer设计ui,保存为ui文件,基于loadUi函数调用
综合来说,loadUi方案最佳。通过designer可以快速设计ui,且可以灵活更改,代码相对简洁。
需要注意,loadUi加载时,ui文件路径是相对于启动程序而言的,而非直接相对于loadUi所在文件。
2、具体
2.1 目录结构
- 主要分为main.py,ui目录和windows目录,这三者同级
- main.py为程序入口
- ui目录存放.ui文件,即相关的designer设计文件,实际是xml格式
- 几乎每一个ui文件都有一个对应的py文件,该py文件中具有一个类,每个类中都有self.window属性,被赋值为loadUi加载解析ui文件的返回值,其它类中属性和函数都是为操作该ui界面服务。windows目录存放的即这些py文件
2.2 ui结构
- 一般,由一个QMainWindow组件作为主窗口,其它窗口组件都是QWidget类型
- 如果项目每次启动时,没有需要创建新的日志存储路径的需求,那么可以设计为main.py直接创建主窗口对象,开启窗口。反之,则会在main.py中创建一个窗口用于路径设置,完成后再创建和打开主窗口
- 主窗口中,通过一个tab组件来管理其它主要功能的子窗口,而子窗口交互时,有可能会弹出临时的子窗口。
- 各tab子页的窗口之间可以沟通,但是组件命名是相互独立的,很方便开发,快速查找需要的组件
- 可以很好的控制各窗口,进行移动、关闭、添加,甚至对一个功能窗口复数添加
- 迭代和不同场景的加载。对一个窗口的迭代基本不影响其他窗口,且允许一个GUI程序的不同入口加载同一功能的窗口,还允许同一窗口被不同GUI程序加载
2.3 命名习惯
- main.py作为入口,windows和ui目录
- ui目录中的文件名称,一般都是小写,下划线连接单词。如果单词过多,可能会对部分单词使用驼峰命名,然后再用下划线与其他单词连接。比如file_search.ui、text_search.ui
- windows目录中的文件名称,一般都是小写,不用下划线分隔,习惯后缀windowclass,声明了其作用,即作为窗口类使用。比如filesearchwindowclass、textsearchwindowclass
- windows目录中各文件的类名称,一般都是各单词首字母大写,习惯后缀Window.比如FileSearchWindow、TextSearchWindow
- windows目录中各文件的类中,对loadUi加载的返回值对象,统一命名为self.window,表示当前窗口对象
- 一般,主窗口对应home.ui和homewindowclass、HomeWindow,初始的路径设置窗口对应start.ui和startwindowclass、StartWindow
组件命名习惯:由于gui开发,涉及到的组件、方法繁多,需要一套命名规范,方便查找使用和迭代。
- 对GUI组件对象,使用designer的默认命名规则,尽量从低到高逐一递增
- 对组件相关的方法,一般依次点明组件所在层次,组件类型,事件,操作。并且按照相关程序从上到下排序
- 对方法和代码写注释,在gui开发中尤为重要。比如注释某个组件在designer中的名称、层次关系、类型、作用
3、代码
(1)main.py
基本不会发生变化
import sys
from PyQt5.QtWidgets import QApplication
from windows.homewindowclass import HomeWindow
"""
启动程序
"""
class my_window:
def __init__(self):
self.window = HomeWindow()
if __name__ == "__main__":
app = QApplication([])
w = my_window()
sys.exit(app.exec_())
(2)start.ui和startwindowclass.py
作为一个常用ui模块,单独阐述
(3)home.ui和homewindowclass.py
home.ui
homewindowclass.py
from PyQt5.QtWidgets import QWidget, QTabWidget
from PyQt5.uic import loadUi
from windows.bytesearchwindowclass import ByteSearchWindow
from windows.comparewindowclass import CompareWindow
from windows.filesearchwindowclass import FileSearchWindow
from windows.textsearchwindowclass import TextSearchWindow
"""
主窗口
"""
class HomeWindow:
def __init__(self):
self.window = loadUi(r'ui\home.ui')
self.window: QWidget
self.window.setWindowTitle('审计工具')
self.window.show()
self.window.tabWidget: QTabWidget
self.window.tabWidget.clear()
self.fileSearch_window, self.textSearch_window, self.byteSearch_window, self.compare_window = None, None, \
None, None
# 添加文件搜索子窗口
self.add_fileSearch()
# 添加文本搜索子窗口
self.add_textSearch()
# 添加字节搜索子窗口
self.add_byteSearch()
# 添加比较子窗口
self.add_compare()
def add_fileSearch(self):
self.fileSearch_window = FileSearchWindow()
self.window.tabWidget: QTabWidget
self.window.tabWidget.addTab(self.fileSearch_window.window, '文件搜索')
def add_textSearch(self):
self.textSearch_window = TextSearchWindow()
self.window.tabWidget: QTabWidget
self.window.tabWidget.addTab(self.textSearch_window.window, '文本搜索')
def add_byteSearch(self):
self.byteSearch_window = ByteSearchWindow()
self.window.tabWidget: QTabWidget
self.window.tabWidget.addTab(self.byteSearch_window.window, '字节搜索')
def add_compare(self):
self.compare_window = CompareWindow()
self.window.tabWidget: QTabWidget
self.window.tabWidget.addTab(self.compare_window.window, '比较')
(3)其他子窗口的创建
class FileSearchWindow:
def __init__(self):
self.window = loadUi(r'ui\file_search.ui')