PyQt学习记录04——通过提升法绘制matplot图形

0. 目录

PyQt学习记录01------加法计算器
PyQt学习记录02------串口助手
PyQt学习记录03------批量设置水印

1. 前言

众所周知的原因,Qt Designer(Qt设计师)的自带的控件十分有限,无法完全满足实际需求,所以我们需要通过一些方法来载入自定义的控件,在此基础上,有提升法(Promotion)和插件法(Plugins)两类。详见此

其中插件法的目标就是为了实现类似原生控件的功能,可以直接在Qt设计师中直接调用,原则上来说是可以调用开源资源来实现,但是我尚未找到pyqt平台可使用的资源,所以本博文暂时先介绍使用提升法。

2. Ui界面

首先还是在设置中,将路径设置到工程文件夹路径,然后新建一个qt界面。新建一个widget

然后在这个这个新建的Widget点击右键------》提升为------》在弹出的窗口中输入以下参数。

首先在提升的类名称 中输入:MplWidget,这时头文件 会自动生成对应的小写的.h文件,确认基类的名称 为QWidget,然后点击添加,最后点击提升

该博文流程更加具体,但是按照他的流程我无法复现,对流程有疑惑的可以参考该博文,最后两段对我很有帮助。

这时你就已经完成了一个widget类的提升,接下来我们的代码将对这个类进行操作。

3. 代码

首先还是通过uic方法将刚刚设置好的ui界面进行转译,这时会在你的转译的py文件中,产生一个引入代码

python 复制代码
from mplwidget import MplWidget

所以,接下来新建一个名为mplwidget.py的文件,并且输入以下代码,用以创建一个MplWidget类,它是 matplotlib 和 PyQt 结合使用的一个自定义绘图小部件(widget)。它继承自 FigureCanvasQTAgg,使 matplotlib 的绘图能够嵌入到 PyQt 界面中。

python 复制代码
# mplwidget.py
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure

class MplWidget(FigureCanvas):
    def __init__(self, parent=None, width=5, height=4, dpi=100):
        # 创建一个 Figure 对象
        self.figure = Figure(figsize=(width, height), dpi=dpi)
        # 调用父类构造函数,将 Figure 传入
        super().__init__(self.figure)
        self.setParent(parent)

这样我们就将matplot与刚刚提升的widget匹配上了,接下来就是需要将这个mplwidget类引入到你实际运行的代码中,添加头文件

python 复制代码
#常规操作
from PyQt5.QtCore import QIODevice
from PyQt5.QtSerialPort import QSerialPort, QSerialPortInfo
from PyQt5.QtWidgets import QApplication, QMainWindow, QTextEdit, QComboBox, QLineEdit, QPushButton
from PyQt5.uic import loadUi
from PyQt5.QtCore import QTime

#核心代码
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout

#这里的S1之前转译的ui文件
from S1 import Ui_MainWindow  # 导入 S1.py 里的 UI 类

from mplwidget import MplWidget  # 我们刚刚创建的自定义 widget

然后你需要初始化

python 复制代码
class SerialCommunicationApp(QMainWindow, Ui_MainWindow):
    def __init__(self):
        super().__init__()
        self.setupUi(self)

        self.ui = Ui_MainWindow()

        # 假设在 Qt Designer 中将提升后的对象名称设置为 "widget"
        # 如果对象名称不同,请使用对应的名称
        self.mplWidget = self.widget

        # 获取 Figure 对象以便绘图
        self.ax = self.mplWidget.figure.add_subplot(111)
        self.plot_data()

然后,创建一个plot_data()函数用于绘图。

python 复制代码
    def plot_data(self):
        wavelengths = [415, 445, 480, 515, 555, 590, 630, 680, 740, 910]
        data = [
            [32, 28, 63, 239, 574, 684, 637, 309,1000, 80],
            [31, 27, 61, 233, 564, 675, 630, 306,1000, 78],
            [52, 35, 85, 678, 1000, 1000, 706, 315,1000, 120]
        ]
        self.ax.clear()
        for i, spectrum in enumerate(data):
            self.ax.plot(wavelengths, spectrum, label=f"data {i+1}")
        self.ax.set_title("data")
        self.ax.set_xlabel("X")
        self.ax.set_ylabel("Y")
        self.ax.legend()
        self.mplWidget.draw()

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

4. 运行结果

5. 参考资料

浅谈Qt Designer中使用自定义控件的提升法
【PyQt】在PyQt5的界面上集成matplotlib绘制的图像
【PyQt】PyQt5进阶------串口上位机及实时数据显示

相关推荐
西岸行者6 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意6 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码6 天前
嵌入式学习路线
学习
毛小茛6 天前
计算机系统概论——校验码
学习
babe小鑫6 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms6 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下6 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。6 天前
2026.2.25监控学习
学习
im_AMBER6 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J6 天前
从“Hello World“ 开始 C++
c语言·c++·学习