PyQtGraph 嵌入Qt界面

PyQtGraph图形可以作为一个 Qt的 widget控件,嵌入到 Qt 程序主窗口中。

我们可以在 Qt Designer 中把 PyQtGraph图形控件 作为第三方控件 加入。

比如,像下面这样:

image

在Qt Designer中加入第三方控件

通过 Qt Designer,我们可以预先把界面上的控件的位置大小设计好,然后动态加载。

但是 界面上摆放的都是 Qt内置的控件, 那么像 PyQtGraph 里面的 PlotWidget这种第三方控件怎么 放到 Qt Designer中呢? 我们的代码又怎么去获取到该控件对应的对象呢?


点击这里,边看视频讲解,边学习以下内容

根据上面的视频,产生的界面ui文件在下面的链接zip文件中

https://github.com/jcyrss/baiyueheiyu/raw/master/py/gui/stock-01.zip


如果你使用的是PySide2, 对应的代码如下,注意第14行 注册的作用

from PySide2.QtWidgets import QApplication
from PySide2.QtUiTools import QUiLoader
import pyqtgraph as pg

class Stock:

    def __init__(self):

        loader = QUiLoader()

        # pyside2 一定要 使用registerCustomWidget 
        # 来注册 ui文件中的第三方控件,这样加载的时候
        # loader才知道第三方控件对应的类,才能实例化对象
        loader.registerCustomWidget(pg.PlotWidget)
        self.ui = loader.load("main.ui")

        hour = [1,2,3,4,5,6,7,8,9,10]
        temperature = [30,32,34,32,33,31,29,32,35,45]

        # 通过控件名称 historyPlot,找到Qt designer设计的 控件
        self.ui.historyPlot.plot(hour,temperature)

app = QApplication([])
stock = Stock()
stock.ui.show()
app.exec_()

如果使用 PyQt5,就更简单了, 无需注册,对应的代码如下

from PyQt5.QtWidgets import QApplication
from PyQt5 import QtWidgets, uic

class Stock:

    def __init__(self):

        # PyQt5 直接加载ui文件
        # 因为 第三方控件通过promote的定义
        # 已经可以知道 控件类所在模块的路径
        self.ui = uic.loadUi("main.ui")

        hour = [1,2,3,4,5,6,7,8,9,10]
        temperature = [30,32,34,32,33,31,29,32,35,45]
        self.ui.historyPlot.plot(hour, temperature)

app = QApplication([])
stock = Stock()
stock.ui.show()
app.exec_()

轴刻度为字符串

上面的程序运行起来, X轴的刻度是 数字, 如果我们希望轴刻度是文字怎么做呢?

我们参考了这个网址的介绍: https://stackoverflow.com/questions/31775468/show-string-values-on-x-axis-in-pyqtgraph?lq=1

需要定义从数字到字符串的映射列表,参考如下代码

import pyqtgraph as pg

# 刻度表,注意是双层列表
xTick = [[(0, 'a'), (1, 'b'), (2, 'c'), (3, 'd'), (4, 'e'), (5, 'f')]]
x = [0,1,2,3,4,5]
y = [1, 2, 3, 4, 5, 6]

win = pg.GraphicsWindow()
stringaxis = pg.AxisItem(orientation='bottom')
stringaxis.setTicks(xTick)
plot = win.addPlot(axisItems={'bottom': stringaxis})
curve = plot.plot(x,y)

pg.QtGui.QApplication.exec_()

如果使用 PlotWidget,则要获取轴对象,参考代码如下

# self.ui.historyPlot 就是 PlotWidget对象
xax = self.ui.historyPlot.getAxis('bottom')
xax.setTicks(xTick)

获取鼠标所在处刻度值

有时候,我们的程序需要获取 鼠标在 pyqtgraph 图形上移动时,鼠标所在对应的数据是什么。

可以参考下面代码的作法

import pyqtgraph as pg
import PySide2

x = [1,2,3,4,5]
y = [1,2,3,4,5]

win = pg.GraphicsWindow()
plot = win.addPlot()
curve = plot.plot(x,y)

def mouseover(pos):
    act_pos = curve.mapFromScene(pos)
    if type(act_pos) != PySide2.QtCore.QPointF:
        return
    print(act_pos.x(),act_pos.y())
    # 有了 act_pos的坐标值,就可以根据该值处理一些信息
    # 比如状态栏展示 该处的 日期等

curve.scene().sigMouseMoved.connect(mouseover)

pg.QtGui.QApplication.exec_()

练习题

开发一个股票数据软件,题目要求见 视频说明 https://www.bilibili.com/video/BV1cJ411R7bP?p=14

VIP实战班学员联系老师获取参考代码。


上一页
下一页