2015-11-14 108 views
0

我能够读取心电图信号并使用QPainter绘制波形。但是,结果波形是通过移除第一个坐标并将新坐标作为最后一个点添加而形成的。所以这给了波浪的滚动效果。使用QPainter的心电图波形绘画

我想知道是否有任何方法可以像患者监护系统那样绘制波形(一个黑色的小节运行波形的长度并更新波形,如this)。

代码示例或代码片段将非常有用。谢谢。

回答

2

下面是几行简单的例子,远非完美,但足以得到的想法:

class ECG : public QWidget { 
    Q_OBJECT 
public: 
    ECG(QWidget * p) : QWidget(p), t(0), x(0), lastPoint(0,0) { 
     setAttribute(Qt::WA_NoSystemBackground); // don't erase previous painting 
    } 

    void paintEvent(QPaintEvent *) { 
     QPainter painter(this); 
     painter.setPen(QPen(Qt::green, 2)); 
     painter.fillRect(x, 0, 60, height(), Qt::black); 
     if (line.length() < 100) painter.drawLine(line); // don't draw a line accross the screen 
    } 

public slots: 
    void drawReading(qreal reading) { 
     x = t++ % width(); 
     QPointF newPoint(x, (reading * height() * 0.4) + (height() * 0.5)); 
     line = QLineF(lastPoint, newPoint); 
     lastPoint = newPoint; 
     update(); 
    } 

private: 
    quint32 t, x; 
    QPointF lastPoint; 
    QLineF line; 
}; 

小部件将吸引类似于你想要什么东西,因为是它被设置为接受范围在-1.0到1.0之间的读数。

enter image description here

您可以用发电机进行测试:

class Gen : public QObject { 
    Q_OBJECT 
public: 
    Gen(int f) : time(0) { 
     t.setInterval(30); 
     freq = (2 * 3.14159)/f; 
     connect(&t, QTimer::timeout, [&](){ 
      qreal r = sin(time); 
      time = fmod(time + freq, 2 * 3.14159); 
      emit newReading(r); 
     }); 
    } 
public slots: 
    void toggle() { t.isActive() ? t.stop() : t.start(); } 
signals: 
    void newReading(qreal); 
private: 
    QTimer t; 
    qreal time, freq; 
}; 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    ECG e(0); 
    e.show(); 
    Gen g(60); 
    QObject::connect(&g, SIGNAL(newReading(qreal)), &e, SLOT(drawReading(qreal))); 
    g.toggle(); 
    return a.exec(); 
}