基于pyqtgraph与PyQt5的多通道EEG/ECG实时绘图GUI整合咨询
实现方案
1. 封装单通道实时绘图逻辑为通用可复用类
把你已经写好的单通道绘图逻辑抽成独立类,不需要继承Qt控件,只要传入目标PlotWidget实例作为初始化参数即可,实现逻辑和UI的完全解耦:
import pyqtgraph as pg import numpy as np class RealTimeWaveChannel: def __init__(self, plot_widget: pg.PlotWidget, channel_name: str, max_data_points=1000): # 绑定传入的PlotWidget实例,不需要修改原有UI生成代码 self.plt = plot_widget self.channel_name = channel_name self.max_len = max_data_points # 初始化数据缓存 self.x_data = np.arange(self.max_len) self.y_data = np.zeros(self.max_len) # 配置当前通道的绘图样式、坐标轴 self.curve = self.plt.plot(pen=pg.mkPen(color='g', width=1)) self.plt.setLabel('left', channel_name, units='uV') self.plt.showGrid(x=True, y=True) def update_data(self, new_point: float): # 复用你原有单通道数据更新逻辑,此处为样例 self.y_data = np.roll(self.y_data, -1) self.y_data[-1] = new_point self.curve.setData(self.x_data, self.y_data)
2. 继承Ui_MainWindow实现主窗口逻辑
完全不需要修改gui.py自动生成的代码,通过多继承的方式加载UI,同时给每个PlotWidget绑定独立的通道实例:
from PyQt5.QtWidgets import QMainWindow from gui import Ui_MainWindow # 导入你自己的数据源模块,比如串口读取、采集卡驱动类 from your_data_source import EEGReader class MyMainWindow(QMainWindow, Ui_MainWindow): def __init__(self, parent=None): super().__init__(parent) # 调用父类方法生成所有UI控件,包括你在QtDesigner中创建的Ch1PlotWidget、Ch2PlotWidget、Ch3PlotWidget self.setupUi(self) # 给每个PlotWidget初始化独立的通道逻辑实例 self.channels = [ RealTimeWaveChannel(self.Ch1PlotWidget, "通道1"), RealTimeWaveChannel(self.Ch2PlotWidget, "通道2"), RealTimeWaveChannel(self.Ch3PlotWidget, "通道3") ] # 绑定数据源更新回调,启动你的原有采集逻辑即可 self.eeg_reader = EEGReader() self.eeg_reader.new_data_received.connect(self.on_new_data) def on_new_data(self, ch1_val: float, ch2_val: float, ch3_val: float): # 新数据到达时分别更新对应通道 self.channels[0].update_data(ch1_val) self.channels[1].update_data(ch2_val) self.channels[2].update_data(ch3_val)
3. 程序入口代码
import sys from PyQt5.QtWidgets import QApplication if __name__ == "__main__": app = QApplication(sys.argv) window = MyMainWindow() window.show() sys.exit(app.exec_())
原有方案失效原因
你直接将单通道逻辑中的self.plt覆盖为self.Ch1PlotWidget的操作仅能处理单个通道,且没有为三个PlotWidget分配独立的数据缓存、绘图实例,三个通道会共用同一套逻辑和缓存,自然无法正常工作。
内容的提问来源于stack exchange,提问作者Will Powell
相关产品推荐
相关产品推荐

