Question

This is my first question here and I believe that I havent seen anyone else asking for this specific problem but what I'm currently dealing with is a qwt plot that doesn't want to replot.

What I want to do: Call the replot() method to clear my current plot.

My problem: When calling replot() does not clear my current plot and my plots are drawn on top of eachother.

Here is a link to an image of my problem

As can be seen in the image, the new curves are drawn on top of the existing ones and this is what I want to solve.

Here is some of my code: (let me know if I missed some parts)

plot.cpp

#include "plot.h"
#include <qwt_plot.h>
#include <qwt_plot_grid.h>
#include <qwt_plot_layout.h>
#include <qwt_plot_canvas.h>
#include <qwt_plot_curve.h>
#include <qwt_plot_directpainter.h>
#include <qwt_curve_fitter.h>
#include <qwt_painter.h>

class CurveData: public QwtArraySeriesData<QPointF>
{
public:
    CurveData()
    {
    }

    virtual QRectF boundingRect() const
    {
        if ( d_boundingRect.width() < 0.0 )
            d_boundingRect = qwtBoundingRect( *this );

        return d_boundingRect;
    }

    inline void append( const QPointF &point )
    {
        d_samples += point;
    }

    void clear()
    {
        d_samples.clear();
        d_samples.squeeze();
        d_boundingRect = QRectF( 0.0, 0.0, -1.0, -1.0 );
    }
};

Plot::Plot( QWidget *parent ):
    QwtPlot( parent )
{
    d_directPainter = new QwtPlotDirectPainter(this);

    setAutoReplot(false);

    setAxisScale(QwtPlot::yLeft, 0.014,0.016);
    setAxisScale(QwtPlot::xBottom, 0, 1000);

    d_curve = new QwtPlotCurve();
    d_curve->setData(new CurveData());

    d_curve->attach(this);
}

void Plot::AppendPoint(const QPointF &point)
{
    CurveData *data = static_cast<CurveData *>(d_curve->data());
    data->append(point);
}

void Plot::DrawCurveSegment()
{
    CurveData *data = static_cast<CurveData *>(d_curve->data());

    d_directPainter->drawSeries(d_curve, data->size()-11, data->size()-1);
}

void Plot::ClearPlot()
{
    CurveData *data = static_cast<CurveData *>(d_curve->data());
    data->clear();

    QwtPlot::replot();
}

mainwindow.cpp

MainWindow::MainWindow(QWidget *parent):
    QWidget( parent )
{
    d_plot = new Plot();
    counter = 0;
    loopCounter = 0;

// ... //

}

void MainWindow::timerEvent(QTimerEvent *) {
    if (counter>0 && counter%1000==0)
    {
        d_plot->ClearPlot();
        d_plot->replot();
        loopCounter++;
        qDebug()<<"clear!";
    }

    for (int ii=0; ii<10;ii++)
    {
        double y = someArray[counter];
        double x = (double)counter-((double)loopCounter*1000);

        counter++;
        d_plot->AppendPoint(QPointF(x,y));
    }
    d_plot->DrawCurveSegment();
}

Would very much appreciate if someone can see what I'm doing wrong.

Best regards!

Was it helpful?

Solution

I solved the problem by changing the clearPlot method to the following:

void Plot::ClearPlot()
{
    CurveData *data = static_cast<CurveData *>(d_curve->data());
    data->clear();

    QwtPlot::replot();
    QwtPlot::repaint();
}

OTHER TIPS

You can also do this:

QwtPlot::detachItems(QwtPlotItem::Rtti_PlotItem, true);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top