QT-Widget-paintEvent绘制动态曲线

先上示例图:

波形示例图如下(数据生成参考QTqml示例Oscilloscope):

如何让曲线动起来:

调用update()函数,会触发paintEvent事件进行页面重绘,将更新后的点的集合重新绘制,连线。使用drawLine()或者drawLines()这个函数。如此绘制连线达到动态效果,曲线一般是添加平滑效果。

代码展示:

头文件.h 

#ifndef DATASOURCE_H
#define DATASOURCE_H

#include <QWidget>
#include <QTimer>

class QPainter;
class widgetWave :public QWidget
{
    Q_OBJECT
public:
    explicit widgetWave(QWidget *appViewer=nullptr);


public slots:
    void generateData(int type=0, int rowCount=2/*所绘制行数*/, int colCount=10000/*所绘制点数*/);
    void timerUpdate();                           //刷新率
    void paintEvent(QPaintEvent *event);
    void init();
private:
    QList<QVector<QPointF> > m_data;
    int m_index;
    QTimer *timer;

};

#endif // DATASOURCE_H

源文件.cpp

#include "widgetWave.h"
#include <QtCore/QDebug>
#include <QtCore/QRandomGenerator>
#include <QtCore/QtMath>
#include <QPainter>
#include <thread>


widgetWave::widgetWave(QWidget *appViewer) :
    QWidget(appViewer),
    m_index(-1)
{
    init();
}


void widgetWave::timerUpdate()
{
    generateData();
}

void widgetWave::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    painter.save();
    painter.setPen(Qt::blue);
    painter.setRenderHint(QPainter::Antialiasing, true);
    painter.setRenderHint(QPainter::SmoothPixmapTransform, true );
    if(m_data.length()<1)
        return;
    QVector<QPointF> pointVec=m_data.at(0);
    painter.drawLines(pointVec);
    painter.restore();
}

void widgetWave::init()
{
    timer=new QTimer(this);
    connect(timer,SIGNAL(timeout()),this,SLOT(timerUpdate()));
    timer->setInterval(50);
    timer->start();
}

//模拟数据
void widgetWave::generateData(int type, int rowCount, int colCount)
{
    // Remove previous data
    m_data.clear();

    // Append the new data depending on the type
    for (int i(0); i < rowCount; i++) {
        QVector<QPointF> points;
        points.reserve(colCount);
        for (int j(0); j < colCount; j++) {
            qreal x(0);
            qreal y(0);
            switch (type) {
            case 0:
                // data with sin + random component
                y = 50+i*100+20*qSin(M_PI / 50 * j) + 0.5 + 15*QRandomGenerator::global()->generateDouble();
                x = j;
                break;
            case 1:
                // linear data
                x = j;
                y = (qreal) i / 10;
                break;
            default:
                // unknown, do nothing
                break;
            }
            points.append(QPointF(x, y));
        }
        m_data.append(points);
    }
    update();
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值