You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 09:06:04