今年4月初开始接触PyQt5,5月开始重新从头学ROS(去年自学过一个月,早就已经啥都不记得了...),吭哧吭哧倒腾了许久,总算是完成了以下三项任务:
1. 基于PyQt5编写GUI界面,界面上包含按钮、编辑框、曲线图等
2. 基于rospy进行简单的自定义消息的发布和订阅
3. 将ROS订阅节点上接收到的实时数据以动态曲线的形式绘制在用PyQt5编写的GUI界面上
过程是艰辛的,没有太多基础,从零开始探索真的很痛苦,在这期间,心态不知道爆炸了多少次。但是当一个一个问题得到了解决,内心也是有成就感和自信心的。
闲言少叙,按上述列出的三项任务的顺序,我们开始说正事儿:
一、基于PyQt5编写GUI界面,界面上包含按钮、编辑框、曲线图等
一般用PyQt5写GUI界面有两种方法:1. 直接写python代码,实现各控件的布局安排和触发机制;2. 借助Qt Designer,以一种可视化的方式完成拖控件调整布局和各种槽函数的设置,并自动生成.py文件。这篇文章的重点其实不在界面的设计上,因此下面就举个简单的例子,直接随便写点python代码就好了。当然咯,在编写布局和功能都比较复杂的GUI界面的时候,按我的习惯,其实是用Qt Designer设计界面,生成.py文件后,再通过添加代码完善功能。
以下就是一段包含一个按钮、一个文本编辑框、一个绘图控件的python代码实例:
# 导入需要的各个模块
import sys
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import pyqtgraph as pg # pyqtgraph是一个很好用的绘图模块
class Signal(QWidget):
def __init__(self):
super(Signal, self).__init__()
self.initUI()
def initUI(self):
self.setGeometry(0, 0, 1200, 800) # 设置GUI界面的大小
self.setWindowTitle('signal_analysis') # 界面窗口名称
layout_chart = QtWidgets.QGridLayout() # 表格布局
self.setLayout(layout_chart)
pg.setConfigOption('background', 'w') # 把绘图控件的背景设置为白色,默认是黑色的
self.pw = pg.PlotWidget()
self.pw.showGrid(x=True, y=True) # 绘图控件显示网格
self.curve = self.pw.plot(pen='k') # 画笔颜色设置
layout_chart.addWidget(self.pw, 0, 0, 9, 10) # 绘图控件在整个GUI界面上所占的区域设置,这里表示绘图控件在表格布局的第一行第一列,并且占据9行10列的区域
bt1 = QPushButton('Button', self) # 按钮控件
layout_chart.addWidget(bt1, 10, 0, 1, 1) # 按钮控件在表格布局中的第11行第1列,因为前面设置了绘图控件占9行,所以前面9行都是绘图控件,第10行空出来,不然图像和别的控件挨太近不好看
text1_edit = QLineEdit("", self) # # 文本编辑框
layout_chart.addWidget(text1_edit, 10, 1, 1, 2) # 文本编辑框放在按钮旁边,占2列宽
def main():
app = QtWidgets.QApplication(sys.argv)
gui = Signal()
gui.show()
sys.exit(app.exec_())
if __name__ =='__main__':
main()
以上代码大部分语句都打了注释,还是很好理解的。代码运行的结果就是得到了如下界面:
总的来说,PyQt5的功能还是很强大的,需要多加练习以达到熟能生巧的状态,我还在生巧的过程中。。。
(备注:PyQt5的学习,主要参考了知乎专栏:https://zhuanlan.zhihu.com/p/48373518?utm_source=wechat_session&utm_medium=social&utm_oi=61921436893184 和《PyQt5快速开发与实战》这本书)