2015-11-14 2 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(); 
} 
Смежные вопросы