先上示例图:
波形示例图如下(数据生成参考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();
}