我在维护曲线指针时遇到问题。在设置样本(或将曲线附加到绘图)期间,发生了内存访问冲突。它发生在updateDisplayingData方法的第3次调用中。调试器在QwtSeriesStore中的void QwtSeriesStore :: setData(QwtSeriesData * series)中捕获了异常。下面是更新的SSCCE代码:
头文件:
#ifndef PLOT_H
#define PLOT_H
#include <qwt_plot.h>
#include <qwt_legend.h>
#include <qwt_plot_curve.h>
class Plot : public QwtPlot
{
Q_OBJECT
public:
explicit Plot(QWidget *parent = 0);
~Plot();
void updateDisplayingData(std::vector<double> data);
private:
void setUpPlot();
void setUpCurves();
void initialXAxisValues();
std::vector<double> XAxisValues;
std::auto_ptr<QwtLegend> legend;
QwtPlotCurve *aXCurve;
};
#endif // PLOT_H
源文件:
#include "plot.h"
Plot::Plot(QWidget *parent)
: QwtPlot(parent)
{
setUpPlot();
setUpCurves();
}
void Plot::setUpPlot()
{
QwtLegend *legend = new QwtLegend;
legend->setFrameStyle(QFrame::Box|QFrame::Sunken);
this->insertLegend(legend, QwtPlot::BottomLegend);
}
void Plot::setUpCurves()
{
aXCurve = new QwtPlotCurve("Acceleration in X axis");
aXCurve->setStyle(QwtPlotCurve::Lines);
aXCurve->setRenderHint(QwtPlotItem::RenderAntialiased);
aXCurve->setPen(QPen(QColor(150,200,200),2));
}
void Plot::initialXAxisValues()
{
double time = 0;
for(int i=0; i<=600; i++)
{
XAxisValues.push_back(time);
time += 0.1;
qDebug() << XAxisValues[i];
}
}
void Plot::updateDisplayingData(std::vector<double> data)
{
this->detachItems(QwtPlotItem::Rtti_PlotItem, true);
aXCurve->setSamples(QVector<double>::fromStdVector(XAxisValues),QVector<double>::fromStdVector(data));
aXCurve->attach(this);
replot();
}
Plot::~Plot()
{
}
同样,当我每次调用update方法时初始化曲线时(以下示例),它都可以正常工作(但不满足项目要求)。
void Plot::updateDisplayingData(std::vector<double> data)
{
this->detachItems(QwtPlotItem::Rtti_PlotItem, true);
QwtPlotCurve *aXCurve1;
aXCurve1 = new QwtPlotCurve("Acceleration in X axis");
aXCurve1->setStyle(QwtPlotCurve::Lines);
aXCurve1->setRenderHint(QwtPlotItem::RenderAntialiased);
aXCurve1->setPen(QPen(QColor(150,150,200),2));
aXCurve1->setSamples(QVector<double>::fromStdVector(XAxisValues),QVector<double>::fromStdVector(data));
aXCurve1->attach(this);
replot();
}
最佳答案
我发现了一个错误。它是在
this->detachItems(QwtPlotItem::Rtti_PlotItem, true);
第二个参数定义分离后的自动删除项。因此,值'true'导致曲线的删除。当我将其更改为“ false”时,一切正常开始工作。