ECG使用QPainter进行波形绘画

时间:2015-11-14 12:40:07

标签: qt graph qpainter

我能够读取ECG信号并使用QPainter绘制波形。但是通过移除第一个坐标并将新坐标作为最后一个点附加来形成所得到的波。所以这给了波浪的滚动效果。

我想知道是否有任何方法可以像患者监控系统一样绘制波形(黑色条形运行波长并像this那样更新波形)。

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

1 个答案:

答案 0 :(得分: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();
}