QwtPlot - 设置样本期间的内存访问冲突

时间:2014-04-03 20:49:45

标签: c++ qt qwt

我遇到了维护曲线指针的问题。我在设置样本期间遇到了内存访问冲突(或将曲线附加到绘图中)。它发生在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();
}

2 个答案:

答案 0 :(得分:0)

我发现了一个错误。它在

this->detachItems(QwtPlotItem::Rtti_PlotItem, true);

第二个参数在分离后定义自动删除项。所以价值真实&#39;导致删除我的曲线。当我将其更改为“假”时每一件事都开始正常运作。

答案 1 :(得分:0)

我也有这个问题,事实证明我只是忘了初始化QwtPlotCurve。显然我需要加强编译器的错误检查...