之前编写工具软件都是用MFC开发,因为都是windows平台,调用Windows的API还是比较方便的,经常开发个基于串口通讯的上位机,就要新建几个文件,而且代码量很大。虽然有很多弊端,但是毕竟写了几个软件框架了,后续有什么需求,直接在框架上修改就能实现,也就没有放弃MFC。
最近刚好需要为实验室的里程计写一个测试软件,因为刚用python写了一个工具,所以也想用python来开发,毕竟开发效率很高,代码会很简单。刚好里程计的测试软件也不复杂,就当是练手了。
总体结构
主要有三个python文件,资源文件、UI文件和主程序。三个的关系如下:

准备工作
软件很简单,就是连接串口,接受数据,解析数据,显示结果,保存数据文件。
用在VS中用pyqt6开发,只需要准备QtDesigner,安装pyqt6就可以了。
这几步直接按照关键词,搜索一下就有很多教程,并不复杂。
UI设计
用QtDesigner设计UI就和现代的其他开发工具一样,所见即所得,把一个个控件拖过去,摆好位置,设置属性,连接回调函数就好了。和移动App开发,MatlabApp开发流程类似。
上位机软件的界面都差不多,无非就是串口设置控件、操作按键、和数据显示及部分。我这几的软件界面如下:
软件界面:

资源文件
用QtDesigner设计界面时,导入资源有两种方式,一种是“导入文件”,一种是“导入资源”。前者在软件启动时需要加载相应的文件,因此一般要把所有文件放到主程序目录下,而后者则可以将其编译成.py文件,直接导入程序中。
这里就发现要想用pyqt开发程序,需要完成QtDesigner、PyUIC、qrc2py三个工具(指令)的配置,这一点相较于其他开发开始比较麻烦的。而且大多是网上的方法都是针对PyCharm的,如果用VS或者PyScript等IDE的话还需要自己摸索配置方法。
【CSDN】Python中QtDesigner、PyUIC、qrc2py的设置
继承与回调响应
pyqt最后一个关键就是得到UI的python类后如何继承并完成功能实现,UI中的控件如何回调(连接信号与槽)。
UI类的继承
UI转成python后,窗口文件会创建Ui_MainWindow类,对话框会创建Ui_Dialog类。因为每次修改改完UI,都会自动生成代码,所以不能直接在UI生成的类上面,完成功能实现。需要单独创建一个类,继承相应的Ui_MainWindow或Ui_Dialog类:
from MainWndForm import Ui_MainWindow
class MainWnd(QDialog, Ui_MainWindow):
def __init__(self):
super(MainWnd, self).__init__()
self.setupUi(self)
def function(self):
...
控件的回调
这一步直接在QtDesigner中编辑信号与槽就可以,在类的定义中实现相应的槽函数就能实现控件动作的相应。
自定义控件
自定义控件对于pyqt的美观度和开发自由度提升有非常大的贡献,但是实现起来也比较麻烦。这个项目中的速度进度条就是通过自定义控件实现的,开发过程对我来说非常痛苦,主要难点就在于资料少,网上的介绍有的还不一样,英文资料也不多,所以是一边看网上的说面,一边试出来的。
这一部分工作量太庞大了,我觉得比上边介绍的全部工作都多,那就下次有需要开发时,好好总结一下再详细介绍吧。
其他重点
win32api
多线程