【问题标题】:ECG like waveform painting using QPainter使用 QPainter 绘制类似 ECG 的波形
【发布时间】:2015-11-14 12:40:07
【问题描述】:

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

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

代码示例或 sn-ps 将非常有帮助。谢谢。

【问题讨论】:

    标签: qt graph qpainter


    【解决方案1】:

    下面是一个简短的示例,虽然远非完美,但足以理解:

    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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 2017-01-27
      • 2020-12-13
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      相关资源
      最近更新 更多