【Qt】解决QCustomPlot实时绘图时数据不断累积的问题

问题

在使用QCustomPlot实时绘图时,随着数据量的增加,内存消耗也会不断增大,需要注意删除前面的数据。
网传的方法有个小问题,因此特地发文更正下。

解决方案

在v1.x版本中可直接通过QCPGraph::removeDataBefore(int x)来实现;但在在v2.x版本中,取消了该函数,但可通过修改源码的方式再现。

1. 修改qcustomplot.h文件

void addData(double key, double value);下面增加void removeDataBefore(int x);的成员函数声明。

// non-property methods:
  void addData(const QVector<double> &keys, const QVector<double> &values, bool alreadySorted=false);
  void addData(double key, double value);
  void removeDataBefore(int x);

2.修改qcustomplot.cpp文件

QCPGraph::addData下面增加void removeDataBefore(int x);的成员函数定义。

void QCPGraph::removeDataBefore(int x)
{
    mDataContainer->removeBefore(x);  // 此处直接将x传入,而非mDataContainer->size()-size
}

3.调用removeDataBefore方法

一般实时绘图以时间戳为x坐标,则调用方法如下,表示删除前25秒的数据。

double xTime = QDateTime::currentDateTime().toMSecsSinceEpoch()/1000.0;
ui->GyroPlot->graph(0)->addData(xTime, gyro[0]);
ui->GyroPlot->graph(0)->removeDataBefore(xTime - 25);

效果展示

绘图的结果只保留25秒以内的数据。
在这里插入图片描述

  • 6
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
### 回答1: Qt5是一种流行的跨平台的图形用户界面(GUI)开发框架。而QCustomPlot则是一个基于Qt5的开源C++绘图库,用于在Qt应用程序中创建各种图表和绘图。它提供了丰富的功能和灵活的接口,可以满足实时绘制的需求。 要在Qt5应用程序中实现实时绘图,可以使用QCustomPlot库。首先,需要在Qt项目中引入QCustomPlot库的头文件和源文件,并在项目配置文件中添加相关的库依赖。 接下来,可以创建一个QWidget或QMainWindow的子类作为绘图窗口,然后在这个窗口中添加一个QCustomPlot对象。可以通过设置QCustomPlot对象的属性来自定义图表的样式和布局,例如坐标轴、图例、线条、图形等。 在实时绘图的过程中,可以通过调用QCustomPlot对象的函数来实时更新图表的数据。例如,可以使用addGraph()函数添加一个新的曲线图,然后使用graph()->setData()函数更新曲线图的数据。在每次更新后,可以使用replot()函数重新绘制图表。 为了实现实时绘图,可以使用定器来定期更新数据并重新绘制图表。通过配合定器和数据源,可以在实时绘图中显示不断变化的数据。 总结起来,使用Qt5和QCustomPlot库可以轻松实现实时绘图功能。只需要引入库文件、创建图表窗口和QCustomPlot对象,并设置图表样式和布局。然后,通过定不断更新数据并重新绘制图表,即可达到实时绘图的效果。这样可以轻松实现各种实时数据的可视化呈现。 ### 回答2: Qt是一种跨平台的C++应用程序开发框架,而QCustomPlot是一个基于Qt的图表绘制库。结合使用QtQCustomPlot,我们可以开发实时更新的图表应用程序。 实时是指图表数据可以动态地更新,并且能够在数据更新自动刷新显示。在Qt中,我们可以使用定器来触发数据更新的操作,然后通过调用QCustomPlot的相关函数来更新图表。 首先,我们需要创建一个QCustomPlot的实例,并设置一些图表的基本属性,如标题、轴的标签等。然后,我们可以创建一个定器,并将其与一个槽函数关联起来。在槽函数中,可以编写代码来更新图表的数据。这些数据可以来自于传感器、文件、网络等来源。一旦数据更新,在槽函数中我们可以调用QCustomPlot的相关函数来更新图表的显示。 具体来说,QCustomPlot提供了一系列函数来设置图表的数据和显示样式。例如,我们可以使用addGraph函数来添加一个曲线图层,使用setData函数来设置曲线的数据,使用rescaleAxes函数来自动调整轴的范围等等。 在定器触发,我们可以更新图表的数据,并通过重新绘制来刷新图表的显示。这可以通过调用replot函数来实现。 此外,QCustomPlot还提供了一些交互功能,如缩放、平移等,可以通过设置相应的参数来启用这些功能。 总的来说,通过组合使用QtQCustomPlot,我们可以很容易地实现实时更新的图表应用程序。在固定的间间隔内更新数据,并通过QCustomPlot实时显示更新后的数据,用户可以实时观察到数据的变化,从而更好地分析和理解数据。 ### 回答3: Qt5是一种用于开发跨平台应用程序的框架,QCustomPlot是一个能够提供实时绘图功能的插件。在使用Qt5和QCustomPlot实现实时功能,需要进行以下步骤: 1. 首先,确保已经正确安装了Qt5和QCustomPlot库,并在项目中添加了相应的头文件和库文件。 2. 创建QCustomPlot对象,该对象将用于实时绘图。可以在主窗口或者自定义的绘图窗口中添加这个对象。 3. 设置绘图区域的参数,例如坐标轴的范围、网格线等。 4. 创建一个定器,用于定触发绘图更新操作。在定器的槽函数中,可以调用QCustomPlot的相应函数进行数据的更新和绘图。 5. 在每次定器触发,更新数据并重新绘制图像。可以通过QCustomPlot的addGraph函数添加新的图层,并使用setData函数设置数据。 6. 当有新的数据添加到图层中,调用replot函数重新绘制图像。 通过上述步骤,就可以实现使用Qt5和QCustomPlot进行实时绘图。在每次定器触发,更新数据并重新绘制图像,从而实现实时的效果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值