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进阶------串口上位机及实时数据显示

相关推荐
love在水一方1 小时前
VLN 入门学习计划 —— 基于 InternNav
学习
red_redemption3 小时前
自由学习记录(175)
学习
nashane4 小时前
HarmonyOS 6学习:画中画(PiP)状态同步与场景化实战指南
学习·pip·harmonyos·harmonyos 5
_李小白5 小时前
【android opencv学习笔记】Day 8: remap(像素位置重映射)
android·opencv·学习
勤劳的进取家5 小时前
数据链路层基础
网络·学习·算法
d111111111d5 小时前
直流电机位置式 PID 控制 和 舵机的区别
笔记·stm32·单片机·嵌入式硬件·学习
懷淰メ6 小时前
【AI加持】基于PyQt+YOLO+DeepSeek的钢材焊接缺陷检测系统(详细介绍)
yolo·目标检测·计算机视觉·pyqt·缺陷检测·deepseek·钢材缺陷
y = xⁿ6 小时前
Redis八股学习日记:布隆过滤器
数据库·redis·学习
d111111111d8 小时前
了解Modbus
网络·笔记·stm32·单片机·嵌入式硬件·学习
charlie1145141918 小时前
通用GUI编程技术——图形渲染实战(三十八)——顶点缓冲与输入布局:GPU的第一个三角形
开发语言·c++·学习·图形渲染·win32