我遇到了维护曲线指针的问题。我在设置样本期间遇到了内存访问冲突(或将曲线附加到绘图中)。它发生在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();
}
答案 0 :(得分:0)
我发现了一个错误。它在
this->detachItems(QwtPlotItem::Rtti_PlotItem, true);
第二个参数在分离后定义自动删除项。所以价值真实&#39;导致删除我的曲线。当我将其更改为“假”时每一件事都开始正常运作。
答案 1 :(得分:0)
我也有这个问题,事实证明我只是忘了初始化QwtPlotCurve。显然我需要加强编译器的错误检查...