pyqtgraph绘图窗口嵌入PyQt5界面

发布于 3 天前  13 次阅读


Please refresh the page if equations are not rendered correctly.
---------------------------------------------------------------

界面与绘图逻辑分离的代码示例

  1. 创建一个单独的绘图类 PlotWidget,负责处理与绘图相关的所有逻辑。
  2. MainWindow 类中调用 PlotWidget 进行图形显示。
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QPushButton
import pyqtgraph as pg

# 创建一个绘图小部件类,负责处理所有绘图相关的逻辑
class PlotWidget(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.layout = QVBoxLayout(self)

        # 创建 pyqtgraph 的绘图窗口
        self.plot_widget = pg.GraphicsLayoutWidget()
        self.layout.addWidget(self.plot_widget)

        # 初始化图表和曲线
        self.plots = []
        self.curves = []

        # 调用函数来创建绘图
        self.create_plots()

    def create_plots(self):
        """Create a simple plot inside the pyqtgraph widget."""
        for i in range(3):  # 假设我们有 3 个信号要绘制
            plot = self.plot_widget.addPlot(title=f"Signal {i + 1}")
            plot.setLabel('left', 'Voltage', units='V')  # 设置Y轴标签
            plot.setLabel('bottom', 'Time', units='s')  # 设置X轴标签
            plot.showGrid(x=True, y=True)  # 显示网格
            curve = plot.plot(pen=pg.intColor(i))  # 创建曲线
            self.plots.append(plot)
            self.curves.append(curve)
            self.plot_widget.nextRow()  # 添加下一行

    def update_plot(self, data_list):
        """Update the curves with new data."""
        for i, data in enumerate(data_list):
            self.curves[i].setData(data)  # 更新曲线数据


# 创建主窗口类,负责处理 PyQt5 界面
class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("PyQt5 with Embedded PyQtGraph")
        self.resize(1200, 800)

        # 创建一个中央小部件
        central_widget = QWidget()
        self.setCentralWidget(central_widget)

        # 创建一个垂直布局
        layout = QVBoxLayout()

        # 创建 PlotWidget 对象,并将其添加到布局中
        self.plot_widget = PlotWidget(self)
        layout.addWidget(self.plot_widget)

        # 添加一个关闭所有串口和文件的按钮
        close_button = QPushButton("Close All")
        close_button.clicked.connect(self.close_all)
        layout.addWidget(close_button)

        # 设置布局到中央小部件
        central_widget.setLayout(layout)

    def close_all(self):
        """Close all resources (for example: files, serial ports, etc.)."""
        print("Closing all resources...")


# PyQt5 应用程序的入口
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())

代码说明:

PlotWidget 类:负责所有绘图相关的操作,包括创建图形窗口、绘制曲线和更新数据。PlotWidget 被封装为一个继承自 QWidget 的类,便于嵌入到任何 PyQt 界面中。

MainWindow 类:负责创建主界面,嵌入 PlotWidget,并处理与界面相关的其他逻辑,如关闭按钮功能。

其他资源:

pyqtgraph嵌入已经设计好的界面中&&动态绘图_pyqt5graph嵌入pyqt5绘制动态曲线-CSDN博客 (未验证)

Everything not saved will be lost.
最后更新于 2024-10-19