基于QCustomPlot的实时曲线图

前言

接上篇,上篇写到图结构的可视化,这一篇介绍实时曲线图。

实现效果

在这里插入图片描述

代码实现

该绘图方法使用QCustomPlot,定义一个继承自QCustomPlot的类Qcurve。

曲线管理

在类中,使用一个map管理各条曲线

QMap<QString, QPointer<QCPGraph>> mGraph;

图例显示:

在类的构造函数中使用

this->legend->setVisible(true);

以显示图例

定时刷新:

使用一个定时器进行定时刷新

timerTick = new QTimer();
timerTick->setInterval(50);
connect(timerTick,SIGNAL(timeout()),this,SLOT(tick()));
timerTick->start();
void QCurve::tick()
{
    this->replot();
}

添加和删除曲线

添加曲线

bool addCurve(QString linename)
{
    if(!mGraph.contains(linename))
    {
        QPointer<QCPGraph> graph = this->addGraph(this->xAxis,this->yAxis);
        graph->setName(linename);
        colorindex++;
        colorindex = colorindex%18;
        QPen pen = QPen(baseColors[colorindex]);
        pen.setWidth(m_width);
        graph->setPen(pen); 
        mGraph.insert(linename,graph);
        return true;
    }
    else
        return false;
}

删除曲线

bool deleteCurve(QString linename)
{
    if(mGraph.contains(linename))
    {
        auto graphit = mGraph.find(linename);
        this->removeGraph(graphit.value());
        mGraph.remove(linename);
        return true;
    }
    else
    {
        return false;
    }
}

添加数据

bool addData(QString linename,int ms, double data)
{
    if(mGraph.contains(linename))
    {
        auto graphit = mGraph.find(linename);
        graphit.value()->addData(ms,data);
        if(graphit.value().data()->dataCount()>m_range)
            graphit.value()->removeDataBefore(m_range);
        this->xAxis->rescale();

        graphit.value()->rescaleValueAxis(!firstdata, true);

        this->xAxis->setRange(this->xAxis->range().upper, m_range, Qt::AlignRight);
        firstdata = false;
        return true;
    }
    else   //没有则添加
    {
        if(addCurve(linename))
            return true;
        return false;
    }
}

修改QCustomPlot源码

本文使用个v2.0.1的qcustomplot,没有了v1.x版本的removeDataBefore函数,因此修改qcustomplot源码进行添加,在QCPGraph类中增加如下公有成员函数。

void QCPGraph::removeDataBefore(int size)
{
    mDataContainer->removeBefore(mDataContainer->size()-size);
}

如何使用

将Qcurve加入到界面,或者可以直接提升控件。

curve = new QCurve();
QGridLayout *curvegrid = new QGridLayout(ui->tab_curve2);
curvegrid->addWidget(curve);

添加和删除曲线

curve->addCurve(linename);
curve->deleteCurve(linename);

添加数据

curve->addData(linename,time,data);

使用建议

在使用时笔者倾向于使用map对所有曲线进行管理。

QMap<QString,int> curveManager;
curveManager.insert(linename, value);
curveManager.remove(linename);

其中value存放linename所需绘图数据的索引。在需要更新界面时,使用curveManager会比较方便。

for(auto it = curveManager.begin();it!=curveManager.end();it++)
{
    int time = alldata[it.value()].time;
    double data = alldata[it.value()].data;
    curve->addData(it.key(),time,data);
}
  • 6
    点赞
  • 47
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: QCustomPlot是一个基于Qt的开源C++图形库,可以用来绘制各种类型的图表,包括动态曲线图。它提供了丰富的功能和灵活的接口,可以满足不同需求的绘图需求。在使用QCustomPlot绘制动态曲线图时,可以通过添加数据点、设置坐标轴范围、设置曲线颜色等方式实现动态更新。同时,QCustomPlot还支持鼠标交互、图例显示、多图层等功能,方便用户进行数据分析和可视化。 ### 回答2: QCustomPlot是一个很好用的Qt绘图库,可以方便地为Qt应用程序绘制曲线图、柱状图、散点图、趋势图等等,支持多种图形效果和动画效果。 要制作一个动态曲线图,首先需要设置曲线图的样式、颜色、轴等等,然后添加数据点并更新曲线图。具体实现步骤如下: Step1:引入QCustomPlot库和相关头文件。(如果使用Qt Creator,通过Qt Maintenance Tool安装QCustomPlot库,然后将头文件包含到项目中。) Step2:在UI窗口中添加QCustomPlot的widget,设定其大小和位置。 Step3:在代码里创建QCustomPlot对象,并设置X、Y轴的范围、精度、网格线等信息。 QCustomPlot *customplot = new QCustomPlot(this); customplot->xAxis->setRange(0, 10); //X轴范围 customplot->yAxis->setRange(-5, 5); //Y轴范围 customplot->xAxis->setAutoTickStep(false); customplot->xAxis->setTickStep(1); //X轴刻度步长 customplot->yAxis->setAutoTickStep(false); customplot->yAxis->setTickStep(1); //Y轴刻度步长 customplot->xAxis->grid()->setVisible(true); customplot->yAxis->grid()->setVisible(true); customplot->xAxis->setLabel(&quot;Time (s)&quot;); //X轴标签 customplot->yAxis->setLabel(&quot;Amplitude&quot;); //Y轴标签 customplot->addGraph(); customplot->graph(0)->setPen(QPen(Qt::blue)); //曲线颜色 Step4:每隔一段时间(例如100ms)更新一下QCustomPlot对象的数据,并刷新曲线图QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(updatePlot())); timer->start(100); // 100ms更新一次 //updatePlot()函数更新数据并刷新曲线图 void updatePlot() { static double t = 0; //时间 static QVector<double> x(101), y(101); //100个数据点 for (int i = 0; i < 101; ++i) { x[i] = t + i/100.0; y[i] = qSin(x[i]); } customplot->graph(0)->setData(x, y); customplot->replot(); //刷新曲线图 t += 0.1; //时间加0.1秒 } 这样,一个简单的动态曲线图就完成了。根据实际需要,可以进一步美化曲线图、调整曲线参数等等。 ### 回答3: Qt QCustomPlot是一个功能强大的C++绘图库,它可以用于创建各种各样的图表,包括动态曲线图。在Qt QCustomPlot中,可以使用QCPGraph类轻松地实现动态曲线图的绘制,该类提供了许多有用的方法和属性,可用于定义和控制图形的外观和行为。 要创建一个动态曲线图,首先要创建一个QCustomPlot对象,用于表示整个图表,并设置其外观和行为。然后,使用QCPGraph类创建一个或多个数据曲线,并将其添加到QCustomPlot对象中。接着,通过添加数据点或设置一个定时器,在动态环境下更新曲线数据,使它们动起来。 在QCustomPlot中实现动态曲线图的步骤如下: 1.创建一个QCustomPlot对象,设置其外观和行为。例如,可以设置背景颜色、坐标轴标签、坐标范围和网格线等属性。 2.创建一个或多个QCPGraph对象,并将其添加至QCustomPlot对象中。对于每个QCPGraph对象,可以设置线条颜色、粗细、线型和数据点圆圈等属性,以及曲线的名称和X、Y坐标数据。 3.在动态环境下更新曲线数据。可以使用addData()方法向曲线中添加数据点,或使用setData()方法设置所有的数据点。可以使用startTimer()方法启动一个定时器,定时更新曲线数据,或在用户操作期间实时更新数据。 4.根据需要,可以添加QCPItemText、QCPItemLine和QCPItemRect等其他元素,以丰富图表的内容。 综上所述,Qt QCustomPlot是一个功能强大的C++绘图库,它可以方便地创建各种各样的图表,包括动态曲线图。使用QCPGraph类和其他元素,可以轻松定义和控制图形的外观和行为,使其在动态的环境下呈现出最佳效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仟人斩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值