qt之QCustomPlot与qchart初级应用-----绘制动态曲线

一、前言

早就想发这个帖子了,但由于单位项目比较紧,一直没腾出时间去学习和发博客,今天趁着再次接触了一下QCustomPlot,把上次要 发的qchart和QCustomPlot做的一些初级练习发出来。

二、开发环境

我的开发环境是QT5.10+MSVC2015,但 qchart和QCustomPlot应用和调用的资源与版本和编译器无大关系,所以基本都可以移植使用。

三、准备&参考文章

附上对我最有帮助的文章链接:https://blog.csdn.net/weixin_42837024/article/details/88669351

四、正文

话不多说,,直接正文,首先是qchart的使用,qchart如果是静态使用,没什么毛病,很多功能很容易就能实现,比如横坐标是时间,特殊类型字符等,如果是动态刷新,目前我是仅仅能用replace方式实现一些数据的动态 刷新,无法实现滚动的时间或者滚动的数据,如果用append方式,总是会运行 一段时间后资源占用过大,到时系统特别卡,从而程序出现崩溃闪退。

附上我的qchart效果图:

实现代码:

#include "aboutchart.h"
#include "ui_aboutchart.h"
#include "mainwindow.h"
QLineSeries *series;
QLineSeries *series1;
QValueAxis *axisX;
QChart *chart;
int chardate[256];
int nowdate[256];
int lastdate[256];

QPieSlice *slice;
QPieSlice *slice1;
QPieSlice *slice2;
QPieSlice *slice3;

QDateTimeAxis *axisX_Time ;
QValueAxis *axisY_Data;//数据点
QLineSeries *dataSeries;
QLineSeries *dataSeries1;
AboutChart::AboutChart(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::AboutChart)
{
    ui->setupUi(this);

    populateThemeBox();

    //初始化表格配置
    m_valueMax=255;
    m_valueCount=1000;
    chartView = new QChartView(createLineChart());
    chartView->setRubberBand(QChartView::HorizontalRubberBand);//设置橡皮筋(放大缩小)可鼠标左键选中范围内放大,右键缩小
    chartView->setRenderHint(QPainter::Antialiasing);//设置抗锯齿
    ui->gridLayout->addWidget(chartView,1,1);
    m_charts << chartView;
    //设置初始表格颜色
    QPalette pal = qApp->palette();
    pal.setColor(QPalette::Window, QRgb(0xf0f0f0));
    pal.setColor(QPalette::WindowText, QRgb(0x404044));
    qApp->setPalette(pal);

    //创建定时器
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(timeSlot()));//绑定定时函数
    timer->start(100);


    //绘制一个圆饼图
    //![1]
    QPieSeries *series = new QPieSeries();
    series->setHoleSize(0.2);//设置饼图孔大小
    series->setPieSize(0.5);//设置饼图大小
    slice = series->append("完成15.6%", 15.6);
    slice->setExploded();
    slice->setLabelVisible();
    slice->setLabelColor(QColor(255,45,46));
    slice->setColor(QColor(43,223,20));
    slice1 = series->append("其他23.8%", 23.8);
    //slice1->setExploded();
    slice1->setLabelVisible();
    slice2 = series->append("未完成4.2%", 4.2);
    //slice2->setExploded();
    slice2->setLabelVisible();
    slice3 = series->append("进行56.4%", 56.4);
    //slice3->setExploded();
    slice3->setLabelVisible();
    //![1]

    //![2]
    QChartView *chartView = new QChartView();
    chartView->setRenderHint(QPainter::Antialiasing);
    chartView->chart()->setTitle("lemon glaze (100g)");
    chartView->chart()->addSeries(series);
    chartView->chart()->legend()->setAlignment(Qt::AlignRight);//设置各个名称显示位置
    chartView->chart()->setTheme(QChart::ChartThemeBrownSand);
    //chartView->chart()->setBackgroundVisible(false);//设置背景不可见
    chartView->chart()->legend()->setFont(QFont("Arial", 7));
    //![2]

    //![3]
    ui->gridLayout->addWidget(chartView,2,2);


    //绘制时间曲线表
    //![1]
    axisX_Time = new QDateTimeAxis();//时间轴
    //QDateTimeAxis需要QDateTime的数值格式
    //axisX_Time->setFormat("mm:ss:zzz");//如果需要其他时间也可以进行修改
    axisX_Time->setFormat("hh:mm:ss");//如果需要其他时间也可以进行修改
    QDateTime temp_StartTime(QDate(2000, 1, 1), QTime(0, 10, 0)); //前面是年月日,后面是小时、分钟、秒
    QDateTime temp_EndTime(QDate(2000, 1, 1), QTime(0, 12, 0));//
    axisX_Time->setTickCount(5);//设置显示的时间个数
    axisX_Time->setRange(temp_StartTime, temp_EndTime);//设置显示范围

    //最后绑定数据即可
    //曲线0
    dataSeries = new QLineSeries();
    dataSeries->setName("DataSeries0");
    dataSeries->setColor(QColor(123,200,50));
    QDateTime temp_AddTimePos(QDate(2000, 1, 1), QTime(0, 10, 0));//生成一个坐标轴时间QDateTime
    for(int i=0;i<50;i++)
        dataSeries->append(temp_AddTimePos.addSecs(i).toSecsSinceEpoch(), qrand()%100);
    //曲线1
    dataSeries1 = new QLineSeries();
    dataSeries1->setName("DataSeries1");
    dataSeries1->setColor(QColor(80,45,250));
    QDateTime temp_AddTimePos1(QDate(2000, 1, 1), QTime(0, 10, 0));//生成一个坐标轴时间QDateTime
    for(int i=0;i<50;i++)
        dataSeries1->append(temp_AddTimePos1.addSecs(i).toSecsSinceEpoch(), qrand()%100);

    QChart *chart = new QChart();
    chart->setTitle("时间数据曲线图");
    chart->setTheme(QChart::ChartThemeBlueCerulean);
    chart->legend()->setAlignment(Qt::AlignTop);//把曲线的名称放到表格上面
    chart->addSeries(dataSeries);//chart添加曲线
    chart->addSeries(dataSeries1);//chart添加曲线
    chart->createDefaultAxes();//创建图表坐标轴
    //chart->axisX()->setRange(0, temp_EndTime.addSecs(100));//设置x轴坐标范围
    //chart->axisY()->setRange(0, 100);//这里设置y轴坐标范围 只有正值
    //!axisX_Time和dataSeries未能成功关联,关联无数据显示。只能分开才能显示数据,但分开仍存在问题,时间更换超初始化append范围就失效不会显示了
    //chart->setAxisX(axisX_Time, dataSeries);//axisX_Time  axisX_Data
    chart->setAxisX(axisX_Time);

    axisY_Data= new QValueAxis();//数据点
    axisY_Data->setTickCount(8);
    axisY_Data->setRange(0, 100);//这里设置y轴坐标范围 只有正值
    chart->setAxisY(axisY_Data);

    //![2]
    QChartView *chartView1 = new QChartView(chart);
    //chartView1->setRubberBand(QChartView::HorizontalRubberBand);//设置橡皮筋(放大缩小)可鼠标左键选中范围内放大,右键缩小
    //chartView1->setRenderHint(QPainter::Antialiasing);//设置抗锯齿
    ui->gridLayout->addWidget(chartView1,1,2);

}

AboutChart::~AboutChart()
{
    delete ui;
}
//初始化chart配置
QChart *AboutChart::createLineChart() const
{
    series = new QLineSeries();
    series->setName("DataSeries");
    for(int i=0;i<256;i++){//初始化图形数值
        nowdate[i]=100;
        series->append(i,nowdate[i]);
        lastdate[i]=nowdate[i];//记录初始化的y值
    }
    chart = new QChart();
    chart->setTitle("数据曲线图");
    chart->legend()->setAlignment(Qt::AlignTop);//把曲线的名称放到表格上面
    //chart->legend()->hide();//隐藏曲线名称
    chart->addSeries(series);//chart添加曲线
    chart->createDefaultAxes();//创建图表坐标轴
    chart->axisX()->setRange(0, m_valueMax);//设置x轴坐标范围
    //chart->axisY()->setRange(-m_valueCount/2-1, m_valueCount/2+1); //设置y轴坐标有正负,但数据未说明有负值
    chart->axisY()->setRange(0, m_valueCount);//这里设置y轴坐标范围 只有正值
    axisX=new QValueAxis;
    axisX->setTickCount(6);//设置背景表格有6列
    chart->setAxisX(axisX,series);
    return chart;
}
void AboutChart::timeSlot()
{
    //动态突出圆饼
    slice->setExploded(qrand()%2);
    slice->setLabelVisible(qrand()%2);
    slice1->setExploded(qrand()%2);
    slice1->setLabelVisible(qrand()%2);
    slice2->setExploded(qrand()%2);
    slice2->setLabelVisible(qrand()%2);
    slice3->setExploded(qrand()%2);
    slice3->setLabelVisible(qrand()%2);
    slice->setColor(QColor(qrand()%255,qrand()%255,qrand()%255));
    slice1->setColor(QColor(qrand()%255,qrand()%255,qrand()%255));
    slice2->setColor(QColor(qrand()%255,qrand()%255,qrand()%255));
    slice3->setColor(QColor(qrand()%255,qrand()%255,qrand()%255));
    slice->setValue(qrand()%100);
    slice1->setValue(qrand()%100);
    slice2->setValue(qrand()%100);
    slice3->setValue(qrand()%100);
    slice->setLabel(tr("完成%1%").arg(qrand()%100));
    slice1->setLabel(tr("其他%1%").arg(qrand()%100));
    slice2->setLabel(tr("未完成%1%").arg(qrand()%100));
    slice3->setLabel(tr("进行%1%").arg(qrand()%100));


    //动态刷新时间表
    //实时时间刷新数据或显示历史时刻数据
    if(ui->checkBox->isChecked()){
        //!未成功,显示范围只能是初始化append那些范围内,实时时间就超范围不好使了
        axisX_Time->setFormat("hh:mm:ss");
        QDateTime qtimeObj = QDateTime::currentDateTime();//获取时间
        axisX_Time->setRange(qtimeObj.addSecs(-50),qtimeObj.addSecs(50) );//设置显示范围
        for(int i=0;i<100;i++){
            qDebug()<<"now time is "<append(qtimeObj.toSecsSinceEpoch(), qrand()%100);
            //dataSeries->replace(qtimeObj.toSecsSinceEpoch(), 0,qtimeObj.toSecsSinceEpoch(), 1);
        }

    }
    else{
        //!未成功,显示范围只能是初始化append那些范围内,更换一个其他的时间段就不好使了
        //axisX_Time->setFormat("mm:ss:zzz");
        QDateTime temp_AddTimePos(QDate(2000, 1, 1), QTime(0, 10, 0));//生成一个坐标轴时间QDateTime
        axisX_Time->setRange(temp_AddTimePos, temp_AddTimePos.addSecs(100));//设置显示范围
        //qDebug()<<"rage time is "<clear();
        //!这样刷新会显示4/5的长度数据,并不会显示4/10,因为坐标轴和数据未关联,数据实际长度是50秒,这里刷新的数据是40秒,坐标轴范围是100秒。
        for(int i=0;i<40;i++){
            //QDateTime temp_AddTimePos(QDate(2000, 1, 1), QTime(0, 9, 50+i));//生成一个坐标轴时间QDateTime
            //dataSeries->append(temp_AddTimePos.toMSecsSinceEpoch()+i-50, qrand()%50);
            dataSeries->append(temp_AddTimePos.addSecs(i).toSecsSinceEpoch(), qrand()%100);
            //dataSeries->append(i, 100);
            //qDebug()<<"history time is "<clear();
        //!这样刷新会显示2/5的长度数据,并不会显示2/10,因为坐标轴和数据未关联,数据实际长度是50秒,这里刷新的数据是20秒,坐标轴范围是100秒。
        for(int i=0;i<20;i++){
            dataSeries1->append(temp_AddTimePos.addSecs(i).toSecsSinceEpoch(), qrand()%100);
        }
     }




    //QDateTime qtimeObj = QDateTime::currentDateTime();//获取时间
    //ids=qtimeObj.toString("hh:mm");
    //aaa=tr("%1").arg(ids);
    //qDebug()<<"num is "<append(num, chardate[num]);

    //series->replace(0,num,chardate[num]);
    qreal x = chart->plotArea().width()/axisX->tickCount();
    num++;
    if(num>=200){
       chart->scroll(x/200, 0);
       //series->remove(num-100,(qrand()%1000)*0.15);
      // num=0;
        series->remove(num-100, chardate[num-100]);
        //chardate[num-100]=0;
    }*/
//单包方式
    for(int i=0;i<256;i++){//随机赋值chardate
        chardate[i]=qrand()*444%800;
    }
    for(int i=0;i<256;i++){
        nowdate[i]=chardate[i];
    }
    for(int i=0;i<256;i++){
        series->replace(i,lastdate[i],i,nowdate[i]);//采用replace方式,比append串行方式节省内存,不会造成长时间运行电脑严重卡顿或者程序崩溃问题
        lastdate[i]=nowdate[i];
    }
}
//下拉模式选择
void AboutChart::populateThemeBox()
{
    // add items to theme combobox
    ui->comboBox->addItem("Light", QChart::ChartThemeLight);
    ui->comboBox->addItem("Blue Cerulean", QChart::ChartThemeBlueCerulean);
    ui->comboBox->addItem("Dark", QChart::ChartThemeDark);
    ui->comboBox->addItem("Brown Sand", QChart::ChartThemeBrownSand);
    ui->comboBox->addItem("Blue NCS", QChart::ChartThemeBlueNcs);
    ui->comboBox->addItem("High Contrast", QChart::ChartThemeHighContrast);
    ui->comboBox->addItem("Blue Icy", QChart::ChartThemeBlueIcy);
    ui->comboBox->addItem("Qt", QChart::ChartThemeQt);
}
void AboutChart::updateUI()
{
    qDebug()<<"change theme!";
    //设置主题颜色
    QChart::ChartTheme theme = static_cast(
                ui->comboBox->itemData(ui->comboBox->currentIndex()).toInt());
    const auto charts = m_charts;
    if (!m_charts.isEmpty() && m_charts.at(0)->chart()->theme() != theme)
    {
        for (QChartView *chartView : charts) {
            chartView->chart()->setTheme(theme);
        }
        // Set palette colors based on selected theme
        //![8]
        QPalette pal = window()->palette();
        if (theme == QChart::ChartThemeLight) {
            pal.setColor(QPalette::Window, QRgb(0xf0f0f0));
            pal.setColor(QPalette::WindowText, QRgb(0x404044));
        //![8]
        } else if (theme == QChart::ChartThemeDark) {
            pal.setColor(QPalette::Window, QRgb(0x121218));
            pal.setColor(QPalette::WindowText, QRgb(0xd6d6d6));
        } else if (theme == QChart::ChartThemeBlueCerulean) {
            pal.setColor(QPalette::Window, QRgb(0x40434a));
            pal.setColor(QPalette::WindowText, QRgb(0xd6d6d6));
        } else if (theme == QChart::ChartThemeBrownSand) {
            pal.setColor(QPalette::Window, QRgb(0x9e8965));
            pal.setColor(QPalette::WindowText, QRgb(0x404044));
        } else if (theme == QChart::ChartThemeBlueNcs) {
            pal.setColor(QPalette::Window, QRgb(0x018bba));
            pal.setColor(QPalette::WindowText, QRgb(0x404044));
        } else if (theme == QChart::ChartThemeHighContrast) {
            pal.setColor(QPalette::Window, QRgb(0xffab03));
            pal.setColor(QPalette::WindowText, QRgb(0x181818));
        } else if (theme == QChart::ChartThemeBlueIcy) {
            pal.setColor(QPalette::Window, QRgb(0xcee7f0));
            pal.setColor(QPalette::WindowText, QRgb(0x404044));
        } else {
            pal.setColor(QPalette::Window, QRgb(0xf0f0f0));
            pal.setColor(QPalette::WindowText, QRgb(0x404044));
        }
        window()->setPalette(pal);
    }
}

#ifndef ABOUTCHART_H
#define ABOUTCHART_H

#include 

#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

/*
QT_BEGIN_NAMESPACE
class QComboBox;
class QCheckBox;
class Ui_ThemeWidgetForm;
QT_END_NAMESPACE
*/
QT_CHARTS_BEGIN_NAMESPACE
class QChartView;
class QChart;
QT_CHARTS_END_NAMESPACE

typedef QPair Data;
typedef QList DataList;
typedef QList DataTable;

QT_CHARTS_USE_NAMESPACE

namespace Ui {
class AboutChart;
}

class AboutChart : public QWidget
{
    Q_OBJECT

public:
    explicit AboutChart(QWidget *parent = 0);
    ~AboutChart();

private Q_SLOTS:
    void updateUI();

private:
    void populateThemeBox();
    void populateAnimationBox();
    void populateLegendBox();
    void connectSignals();

    QChart *createLineChart() const;
private slots:

    void timeSlot();
 /*   void updateStr(QString str);
    void updateStr2(QByteArray str);*/

private:
    Ui::AboutChart *ui;
    int m_valueMax;
    int m_valueCount;
    QList m_charts;

    QChartView *chartView;
    QTimer *timer;


};

#endif // ABOUTCHART_H

这里关于qchart资源配置的地方,就不介绍了,可直接参考qt自带例程qchart部分。

接下来介绍一些QCustomPlot的初级应用,相比之下,QCustomPlot实现的功能更强大,效果更好一些,代码部分操作也很简便,比qchart好。刚用QCustomPlot,我就很容易的实现了动态时间数据刷新等一些qchart不容易 实现的功能,还有一个很重要的功能是鼠标能实时显示曲线的数据,而不是坐标轴的数据,这个还在研究中,弄好了在单独发一个博客,下面放上我练习实现的QCustomPlot效果:

贴代码:

#include "aboutqcustomplot.h"
#include "ui_aboutqcustomplot.h"
#include "mainwindow.h"

aboutqcustomplot::aboutqcustomplot(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::aboutqcustomplot)
{
    ui->setupUi(this);

    SimpleDemo(ui->widget);
    SimpleDemo1(ui->widget_2);
    SimpleDemo2(ui->widget_3);
    SimpleDemo3(ui->widget_4);

    //创建定时器
    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(timeSlot()));//绑定定时函数
    timer->start(1000);

    ui->checkBox->setChecked(true);
    ui->checkBox_2->setChecked(true);
}

aboutqcustomplot::~aboutqcustomplot()
{
    delete ui;
}
void aboutqcustomplot::SimpleDemo(QCustomPlot *CustomPlot)
{
    QDateTime qtimeObj = QDateTime::currentDateTime();//获取时间
    //for(int i=0;i<=6;i++)
    //    time<xAxis->setRange(time.at(0),time.at(time.size()-1));
    }
    else
    {
        //容器数据现在是正好100个  把第一个出栈  把第101个入栈  正好还是100个数据
        y.removeFirst();
        time.removeFirst();
        //入栈
        time.append(qtimeObj.toTime_t());
        y.append(qrand()%50);//新值随机数
        //设置范围正好 能显示当前点
        CustomPlot->xAxis->setRange(time.at(0),time.at(time.size()-1));
    }
    if(time.count()==1){
        //增加一条线
        CustomPlot->addGraph();
        //设置Y轴范围
        CustomPlot->yAxis->setRange(0,100);//设置y轴范围


    }
    qDebug()<<"num is"< timer(new QCPAxisTickerDateTime);
    //timer->setDateTimeFormat("yyyy-MM-dd");    //设置时间格式
    timer->setDateTimeFormat("hh-mm-ss");    //设置时间格式
    timer->setTickCount(7);    //设置时间轴 一共几格
    CustomPlot->xAxis->setTickLabelRotation(30);//设置label 旋转30° 横着显示可能显示不全
    timer->setTickStepStrategy(QCPAxisTicker::tssMeetTickCount);//允许执行可读性较差的滴答步骤,从而有助于更接近所请求的滴答计数
    //设置坐标轴
    CustomPlot->xAxis->setTicker(timer);
    //CustomPlot->xAxis->setRange(time.at(0),time.at(6));
    CustomPlot->graph(0)->setData(time,y);
    //可以进行鼠标位置 放大缩小 拖拽  放大缩小坐标系!!!功能非常强大
    CustomPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
    //重绘 每次改变完以后都要调用这个进行重新绘制
    CustomPlot->replot();

}

void aboutqcustomplot::SimpleDemo1(QCustomPlot *CustomPlot)
{

    QVector x(101),y(101);
    for(int i=0;i<101;i++)
    {
        x[i] = i/5.0-10;
        y[i] = x[i]*x[i]*x[i];
    }
    CustomPlot->addGraph();
    CustomPlot->graph(0)->setPen(QPen(Qt::green));
    CustomPlot->graph(0)->setData(x,y);

    QVector temp(100),temp1(100);
    for(int i=0;i<100;i++)
    {
        temp[i] = i;
        temp1[i] = 100*i;
    }
    CustomPlot->addGraph();
    CustomPlot->graph(1)->setPen(QPen(Qt::red));
    CustomPlot->graph(1)->setData(temp,temp1);

    CustomPlot->xAxis->setLabel("x");
    CustomPlot->yAxis->setLabel("y=x³");

    CustomPlot->xAxis->setRange(0,11);
    CustomPlot->yAxis->setRange(0,1100);

    //可以进行鼠标位置 放大缩小 拖拽  放大缩小坐标系!!!功能非常强大
    CustomPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
    //重绘 每次改变完以后都要调用这个进行重新绘制
    CustomPlot->replot();


}

void aboutqcustomplot::SimpleDemo2(QCustomPlot *CustomPlot)
{
    QVector time;
    QVector y;
    //模拟几个时间 .toTime_t()是转换为 时间戳 从1970年到现在的秒数
    QDateTime temp_AddTimePos(QDate(2019, 1, 1), QTime(23, 10, 0));//生成一个坐标轴时间QDateTime
    for(int i=0;i<10;i++)
        time<addGraph();
    //设置Y轴范围
    CustomPlot->yAxis->setRange(0,100);//设置y轴范围
    //QCPAxisTickerDateTime 时间坐标轴 必须要用 智能指针
    QSharedPointer timer(new QCPAxisTickerDateTime);
    //timer->setDateTimeFormat("yyyy-MM-dd");    //设置时间格式
    timer->setDateTimeFormat("hh-mm-ss");    //设置时间格式
    timer->setTickCount(10);    //设置时间轴 一共几格
    CustomPlot->xAxis->setTickLabelRotation(30);//设置label 旋转30° 横着显示可能显示不全
    timer->setTickStepStrategy(QCPAxisTicker::tssMeetTickCount);//允许执行可读性较差的滴答步骤,从而有助于更接近所请求的滴答计数
    //设置坐标轴
    CustomPlot->xAxis->setTicker(timer);
    CustomPlot->xAxis->setRange(time.at(0),time.at(9));
    CustomPlot->graph(0)->setData(time,y);
    //可以进行鼠标位置 放大缩小 拖拽  放大缩小坐标系!!!功能非常强大
    CustomPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
    //重绘 每次改变完以后都要调用这个进行重新绘制
    CustomPlot->replot();

}

void aboutqcustomplot::SimpleDemo3(QCustomPlot *CustomPlot)
{
    //static QVector sx_vec,xAxis_vec; //存放数据的容器  在h文件中声明,这里声明再次进入界面崩溃,不知道为什么

    //m_chartPoint_counter  计数器  一直增加 来一条数据增加一下 控制x轴前进 实现动态效果

    //这时容器里面还没100个点 所有一直向里面存
    if(m_chartPoint_counter<100)
    {
        sx_vec.append(qrand()%50);//新值随机数
        xAxis_vec.append(m_chartPoint_counter);
        //设置范围正好 能显示当前点
        CustomPlot->xAxis->setRange(0,xAxis_vec.at(xAxis_vec.size()-1));
    }
    else
    {
        //容器数据现在是正好100个  把第一个出栈  把第101个入栈  正好还是100个数据
        sx_vec.removeFirst();
        xAxis_vec.removeFirst();
        //入栈
        xAxis_vec.append(m_chartPoint_counter);
        sx_vec.append(qrand()%50);//新值随机数
        //设置范围正好 能显示当前点
        CustomPlot->xAxis->setRange(xAxis_vec.at(0),xAxis_vec.at(xAxis_vec.size()-1));
    }
    //qDebug()<<"num is"<addGraph();
        CustomPlot->graph(0)->setPen(QPen(Qt::gray));
        CustomPlot->xAxis->setLabel("time");
        CustomPlot->yAxis->setLabel("y=qrand%50");
    }

    CustomPlot->yAxis->rescale(true);//设置Y轴坐标系 自动缩放以正常显示所有的数据
    //CustomPlot->yAxis->setRange(0,100);//设置y轴范围

    CustomPlot->graph(0)->setData(xAxis_vec,sx_vec);//设置数据
    //可以进行鼠标位置 放大缩小 拖拽  放大缩小坐标系!!!功能非常强大
    CustomPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);
    CustomPlot->replot();//重绘制
    //这里必须要一直增加 如果增加到10就不增加 效果就是第10个点一直变化 不会出现动态效果
    m_chartPoint_counter++;

}
void aboutqcustomplot::timeSlot()
{
    if(ui->checkBox_2->isChecked())
        SimpleDemo3(ui->widget_4);
    if(ui->checkBox->isChecked())
        SimpleDemo(ui->widget);

}
#ifndef ABOUTQCUSTOMPLOT_H
#define ABOUTQCUSTOMPLOT_H

#include 
#include 
#include "QCustomPlot/qcustomplot.h"



namespace Ui {
class aboutqcustomplot;
}

class aboutqcustomplot : public QWidget
{
    Q_OBJECT

public:
    explicit aboutqcustomplot(QWidget *parent = 0);
    ~aboutqcustomplot();

private slots:
    void SimpleDemo(QCustomPlot *customPlot);
    void SimpleDemo1(QCustomPlot *customPlot);
    void SimpleDemo2(QCustomPlot *customPlot);
    void SimpleDemo3(QCustomPlot *customPlot);
    void timeSlot();
private:
    Ui::aboutqcustomplot *ui;
    QTimer *timer;
    QVector time;
    QVector y;
    QVector sx_vec,xAxis_vec; //存放数据的容器
    int m_chartPoint_counter=0;
};

#endif // ABOUTQCUSTOMPLOT_H

结语&效果

好了,该说的能说的我都放上面了,代码也贴全了,完全不想自我保留,没意思,分享给大家,希望能帮助到需要的人。最后附上我的工程链接:https://download.csdn.net/download/qq_37603131/11305578

你可能感兴趣的:(qt,qt,qchart动态静态)