使用 QPainter 绘制类似心电图的波形图
ECG like waveform painting using QPainter
我能够读取 ECG 信号并使用 QPainter 绘制波形图。但是生成的波是通过删除第一个坐标并将新坐标附加为最后一个点而形成的。所以这给波浪带来了滚动效果。
我想知道是否有任何方法可以像病人监护系统那样绘制波浪(黑条 运行 波浪的长度并像 this 一样更新波浪) .
代码示例或片段将非常helpful.Thanks。
这是一个简单的几行示例,远非完美,但足以理解这个想法:
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 范围内的读数。
你可以用生成器测试它:
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();
}
我能够读取 ECG 信号并使用 QPainter 绘制波形图。但是生成的波是通过删除第一个坐标并将新坐标附加为最后一个点而形成的。所以这给波浪带来了滚动效果。
我想知道是否有任何方法可以像病人监护系统那样绘制波浪(黑条 运行 波浪的长度并像 this 一样更新波浪) .
代码示例或片段将非常helpful.Thanks。
这是一个简单的几行示例,远非完美,但足以理解这个想法:
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 范围内的读数。
你可以用生成器测试它:
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();
}