Qt动态波形图实现

在使用串口调试助手中可能需要查看数据的波形图
以下是使用QtChart的一种实现

在这里插入图片描述

  • 波形图动态更新,通过回看方式观察前几页的波形图,每次波形图写满一页更新滑动条

  • 头文件

#ifndef DCHART_H
#define DCHART_H

#include <QWidget>
#include <QtCharts>
#include <vector>
#include <QHBoxLayout>
#include <QDebug>

class dChart : public QWidget
{
    Q_OBJECT
public:
    explicit dChart(QWidget *parent = nullptr);

    void setViewMode(bool model);
    int  getCurPage();
    void setRange(double min,double max);
signals:
    void push_value(double value);
    void curPageChange();
    
public slots:

    void recv_value(double value);
    void browsing_mode(int page);

private:
    QLineSeries *m_pLineSeries;
    QChart *m_pChart;
    QValueAxis *m_pAxisX ;
    QValueAxis *m_pAxisY ;
    QChartView *chartView;

    std::vector<double>points;

    //参数配置

    int timeBase=0;
    int maxPage;
    int curPage=0;
    int curPointX=0;
    bool viewMode=false;
    double minYValue=-40;
    double maxYValue=0;
};
#endif // DCHART_H
  • 源文件
#include "dchart.h"

dChart::dChart(QWidget *parent) : QWidget(parent)
{
    maxPage=100;//一页显示最大点数


    //x坐标轴
    m_pAxisX = new QValueAxis();
    m_pAxisX->setMin(0);
    m_pAxisX->setMax(maxPage);
    //y坐标轴
    m_pAxisY = new QValueAxis();
    m_pAxisY->setRange(minYValue, maxYValue);

    //创建QChart
    m_pChart = new QChart();

    m_pLineSeries = new QLineSeries(); //创建折线绘制对象

    m_pChart->addSeries(m_pLineSeries);

    m_pChart->addAxis(m_pAxisX, Qt::AlignBottom); //将X轴添加到图表上
    m_pChart->addAxis(m_pAxisY, Qt::AlignRight); //将Y轴添加到图表上

    //创建折线类

    m_pLineSeries->setPointsVisible(true); //设置数据点可见
    m_pLineSeries->attachAxis(m_pAxisX); //X轴绑定
    m_pLineSeries->attachAxis(m_pAxisY); //Y轴绑定



    m_pLineSeries->setPen(QPen(Qt::black, 2, Qt::SolidLine));


    m_pChart->setMargins(QMargins(0, 0, 0, 0));
    m_pChart->legend()->hide(); //隐藏图例

    //绑定chart控件
    chartView = new QChartView(this);
    chartView->setChart(m_pChart);
    chartView->setRenderHint(QPainter::Antialiasing);

    QHBoxLayout*hlayout=new QHBoxLayout(this);
    hlayout->addWidget(chartView);


    connect(this,&dChart::push_value,this,&dChart::recv_value);
}
void dChart::recv_value(double value)
{
        points.push_back(value);
        if(curPointX==maxPage){
            curPage++;
            if(!viewMode)curPageChange();
            curPointX=0;
        }

        curPointX++;

        if(!viewMode){
            browsing_mode(curPage);
        }
}
void dChart::browsing_mode(int page){
    m_pChart->axisX()->setMin(timeBase+maxPage*page);
    m_pChart->axisX()->setMax(timeBase+maxPage*page+maxPage);
    m_pLineSeries->clear();//即使清空内存

    int curPoint=timeBase+maxPage*page+maxPage;
    //这种方式每次有新的数据加入进来都会刷新当前页面波形图的所有点
    //这样会导致增加cpu执行次数,但是可以减小数据过多的内存占用
    for(int i=timeBase+maxPage*page;(i<points.size())&&i<curPoint;++i){//每次刷新保证不占用过大内存
        double tmp;
        if(points[i]<minYValue){
            tmp=minYValue;
        }else if(points[i]>maxYValue){
            tmp=maxYValue;
        }else{
            tmp=points[i];
        }
        m_pLineSeries->append(QPointF(i, tmp));
    }
}
void dChart::setViewMode(bool model){
    this->viewMode=model;
}
int  dChart::getCurPage(){
    return this->curPage;
}
void  dChart::setRange(double min,double max){
    this->minYValue=min;
    this->maxYValue=max;
    m_pAxisY->setRange(minYValue, maxYValue);
    this->update();
    return;
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值