qt的窗体构成:
QMainWindow Class | Qt Widgets 5.15.12https://doc.qt.io/qt-5.15/qmainwindow.html
图2:QDockWidget Class | Qt Widgets 5.15.12
Qt GUI几乎都是由几个基本组件组成:
- 一个窗口。 这通常由QMainWindow提供,但请注意,如果窗口小部件没有父窗口,只需调用widget.show(),就可以在窗口中显示所有QWidgets。
- 多个QWidget实例,如QPushButton,QLabel,QComboBox等
- QLayout实例(可选,但强烈鼓励),它可以自动管理窗口小部件的位置,同时允许GUI以可调整的方式调整大小。
PyQtGraph通过提供自己的QWidget子类插入到你的GUI中来适应这个方案。
from PyQt5 import QtWidgets
import pyqtgraph as pg
app = QtWidgets.QApplication([]) # 创建一个应用
w = QtWidgets.QWidget() # 创建一个窗口
# 创建一些窗口部件
btn = QtWidgets.QPushButton('press me')
text = QtWidgets.QLineEdit('enter text')
listw = QtWidgets.QListWidget()
plot = pg.PlotWidget()
# 设置窗口布局
layout = QtWidgets.QGridLayout()
w.setLayout(layout)
# 窗口布局添加部件
layout.addWidget(btn, 0, 0) # button goes in upper-left
layout.addWidget(text, 1, 0) # text edit goes in middle-left
layout.addWidget(listw, 2, 0) # list widget goes in bottom-left
layout.addWidget(plot, 0, 1, 3, 1) # plot goes on right side, spanning 3 rows
w.show() # 显示窗口
app.exec_() # 开始Qt事件循环
运行如下图所示:
命名约定
事实上pyqtgraph中的每个类都是Qt提供的基类的扩展。 在阅读文档时,请记住Qt的所有类都以字母“Q”开头,而pyqtgraph的类没有。 在阅读任何类的方法时,这样通常有助于查看使用了哪些Qt基类,然后查看Qt文档。
大多数Qt的类都定义了很难区别于常规方法的信号。几乎所有由pyqtgraph定义的信号显示都以'sig'开头,表示这些信号不是在Qt级定义。
在大多数情况下,以'Widget'结尾的类都是QWidget的子类,因此可以用作Qt窗口中的GUI元素。 以'Item'结尾的类是QGraphicsItem的子类,只能在QGraphicsView实例(如GraphicsLayoutWidget或PlotWidget)中显示。
有关Qt GraphicsView更多信息:https://blog.youkuaiyun.com/kenfan1647/article/details/117383803
在pyqtgraph中绘图
绘图分为三个步骤:
1.创建一个app
2.创建一个窗体部件(widget)接收绘图项.向窗体部件中添加需要的绘图项(曲线、文字标签、柱状图等)
- 常用创建绘图窗体方式:
- 1.win = pg.GraphicsLayoutWidget(show=True) #最简洁
- 2.win = pg.GraphicsView()
- 3.win = pg.PlotWidget(show=True)
- 4.win = pg.LayoutWidget(show=True)
- 5.win = pg.GraphicsLayout()
3.app进入事件循环
使用GraphicsWindow方法绘制图形:
import numpy as np
import pyqtgraph as pg
app = pg.mkQApp()
# win = pg.GraphicsWindow()
win = pg.GraphicsLayoutWidget(show=True)
win.setWindowTitle("多条曲线的显示")
win.resize(800,600)
x = np.linspace(-5*np.pi,5*np.pi,500)
y1 = 0.5*np.sin(x)
y2 = 2*np.cos(x)
y3 = np.sinc(x)
y4 = np.sinc(x)
# 创建绘图区域plot1,plot2,plot3
plot1 = win.addPlot(left="Amplitude",bottom="x",title="y1,y4")
win.nextRow()#切换下一行插入绘图区域
plot2 = win.addPlot(left="Amplitude",bottom="x",title="y2")
win.nextRow()
plot3 = win.addPlot(left="Amplitude",bottom="x",title="y3")
line1 = pg.PlotCurveItem(pen='r')
# line1 = pg.PlotDataItem(pen='r')
line2 = pg.PlotCurveItem(pen='y')
plot1.addItem(line1)
plot1.addItem(line2)
# for p,y,pen in zip([plot1,plot2,plot3],[y1,y2,y3],['r','g','y']):
for p,y,pen in zip([plot2,plot3],[y2,y3],['g','y']):
p.plot(x,y,pen=pen)
p.showGrid(x=True,y=True)
p.setRange(xRange=[-5*np.pi,5*np.pi],yRange=[-2.3,2.3],padding=0)
#plot1.plot(x,y4,pen='y')
line1.setData(x,y1,pen='r')
line2.setData(x,y4,pen='y')
app.exec_()
程序运行效果如下: