Qt charts动态实时波形显示

源码点这
先看效果吧
在这里插入图片描述

在这里插入图片描述
原理很简单,就是每次定时器进入的时候将波形数据往前移动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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值