源码点这
先看效果吧
原理很简单,就是每次定时器进入的时候将波形数据往前移动50个点,不多说直接上代码
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtMath>
const quint16 DataMaxSize = 1024;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_chart = new QChart();//画笔
m_series = new QSplineSeries();//折线
// m_series->setUseOpenGL(true);//加速只支持QLineSeries和QScatterSeries
for(int i = 0; i < DataMaxSize; i++)//折线添加数据
{
m_series->append(i, 10*sin(0.02*i));
}
m_chart->addSeries(m_series);
// m_chart->createDefaultAxes();//基于已经添加的series创建默认坐标轴 须在addSeries之后调用才有效
//构建坐标轴
m_axisX = new QValueAxis();
m_axisX->setRange(0, DataMaxSize);//范围
m_axisX->setTitleText("X");//轴标题
m_axisX->setTickCount(10);//设置刻度数
m_axisY = new QValueAxis();
m_axisY->setRange(-10, 10);
m_axisY->setTitleText("Y");
// 以下方式添加编译器提示过时
// m_chart->setAxisX(m_axisX,m_series);//坐标轴与系列进行绑定
// m_chart->setAxisY(m_axisY,m_series);
//另一种方法
m_chart->addAxis(m_axisX,Qt::AlignBottom); //坐标轴添加到图表,并指定方向
m_chart->addAxis(m_axisY,Qt::AlignLeft);
m_series->attachAxis(m_axisX); //序列 m_series 附加坐标轴
m_series->attachAxis(m_axisY);
m_chart->setTheme(QtCharts::QChart::ChartThemeBlueCerulean);//设置主题
m_chart->legend()->hide();//隐藏图例
m_chart->setTitle(QString::fromLocal8Bit("Polyline Chart"));//为图表添加标题
m_chartView = new QChartView(m_chart); //画布
m_chartView->setRenderHint(QPainter::Antialiasing);//抗锯齿
this->resize(800,400);
this->setCentralWidget(m_chartView);
//构建定时器
m_timer = new QTimer(this);
m_timer->setInterval(20);
m_timer->start();
connect(m_timer,&QTimer::timeout,this, &MainWindow::timerSlot);
}
MainWindow::~MainWindow()
{
// chart->removeAllSeries();
delete m_series;
delete ui;
}
//将后面数据向前平移,每次平移50个点,补充新数据,更新系列
void MainWindow::timerSlot()
{
QVector<QPointF> pts0ld = m_series->pointsVector();//原始数据
QVector<QPointF> ptsNew;//更新后的数据
//将后面数据向前平移
qint64 i =0;
for(i = 0; i < pts0ld.count()-50; i++)
{
ptsNew.append(QPointF(i, pts0ld[50 + i].y()));//将后面数据平移到开头
}
//补充新数据,继续补充到ptsNew后面
for(i = pts0ld.count()-50; i < pts0ld.count(); i++)
{
ptsNew.append(QPointF(i, pts0ld[i-pts0ld.count()+50].y()));//这里新数据可以用随机数
}
m_series->replace(ptsNew);
}
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtCharts>
//#include <QDateTimeAxis>
#include <QValueAxis>
#include <QTimer>
//#include "QDateTime"
QT_CHARTS_USE_NAMESPACE
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void timerSlot();
private:
Ui::MainWindow *ui;
QTimer *m_timer; //定时器
QChart *m_chart; //画笔
QChartView *m_chartView;//画布
// QLineSeries *m_series;//折线
QSplineSeries *m_series;//曲线
QValueAxis *m_axisX; //轴
QValueAxis *m_axisY;
};
#endif // MAINWINDOW_H