在使用串口调试助手中可能需要查看数据的波形图
以下是使用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;
}