Qt使用QCustomPlot绘制动态曲线简单记录

本文主要记录本人使用QCustomPlot中的setData()绘制实时曲线的过程,包括一些QCustomPlot的简单设置和使用,具体安装QCustomPlot的过程不做介绍。

具体需求是根据一个实时回传的数据绘制动态曲线,横坐标显示时间,纵坐标显示值。

使用setData()绘制曲线需要自己设置两个数组

QVector xAxisData;//x轴的数据
QVector lineOne;//曲线1
QVector lineTwo;//曲线2
QTimer *testTimer;//计时器用于模拟增加新数据

对动态曲线的一些简单设置

xAxisData= QVector();
lineOne = QVector();
lineTwo = QVector();
customPlot = ui->widget;
customPlot->addGraph();
customPlot->graph(0)->setPen(QPen(QColor(40, 110, 255)));//曲线1蓝色
customPlot->addGraph();
customPlot->graph(1)->setPen(QPen(QColor(255, 110, 40)));//曲线2红色

//坐标轴使用时间刻度
QSharedPointer timeTicker(new QCPAxisTickerTime);
//timeTicker->setTimeFormat("%h:%m:%s");
timeTicker->setTimeFormat("%h:%m:%s.%z");
customPlot->xAxis->setTicker(timeTicker);

//设置y轴范围
customPlot->yAxis->setRange(-1.2, 1.2);

//设置画面缩放
customPlot->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom);

// 使上下轴、左右轴范围同步
connect(customPlot->xAxis, SIGNAL(rangeChanged(QCPRange)), customPlot->xAxis2, SLOT(setRange(QCPRange)));
connect(customPlot->yAxis, SIGNAL(rangeChanged(QCPRange)), customPlot->yAxis2, SLOT(setRange(QCPRange)));
//定时器
testTimer = new QTimer();
//绑定定时器到时触发的槽函数
connect(testTimer, SIGNAL(timeout()), this, SLOT(my_test_timer_slot()));

主要的实现都在my_test_timer_slot()这个槽函数里面

void MainWindow::my_test_timer_slot(){
    //静态变量存储上一个时刻的值
    static double lastPointKey = 0;
    //获取当前的时间
    int nowtime = QTime::currentTime().msecsSinceStartOfDay();
    double key = nowtime;
    //添加x轴的时间数据
    xAxisData.append(key*0.001);
    if (key-lastPointKey > 200) //大约200毫秒更新一次数据
    {
        //确保x轴只保存最近的200个数据
        if(myKey.size()>200){
            myKey.removeFirst();
        }
        //确保lineOne只保存最近的200个数据
        if(lineOne.size()>200){
            lineOne.removeFirst();
        }
        //添加随机数据
        lineOne.append(qSin(key)+qrand()/(double)RAND_MAX*1*qSin(key/0.3843));

        //确保lineTwo只保存最近的200个数据
        if(lineTwo.size()>200){
            lineTwo.removeFirst();
        }
        //添加随机数据
        lineTwo.append(qCos(key)+qrand()/(double)RAND_MAX*0.5*qCos(key/0.4364));

        customPlot->graph(0)->setData(xAxisData,lineOne,true);
        customPlot->graph(1)->setData(xAxisData,lineTwo,true);

        //记录当前时刻
        lastPointKey = key;
    }
    //设置x轴显示的数据个数
    customPlot->xAxis->setRange(key*0.001, 10, Qt::AlignRight);
    //设置y轴根据值自适应
    customPlot->yAxis->rescale();
    //绘图
    customPlot->replot(QCustomPlot::rpQueuedReplot);

}

 

你可能感兴趣的:(qt,前端,开发语言)