C++ Qwt-replot不清除当前绘图

C++ Qwt-replot不清除当前绘图,c++,qt,plot,qwt,C++,Qt,Plot,Qwt,这是我在这里的第一个问题,我相信我没有看到任何人问这个具体问题,但我目前正在处理的是一个qwt图,不想回答 我要执行的操作:调用replot()方法以清除当前绘图 我的问题:调用replot()时,不会清除我的当前绘图,并且我的绘图是相互重叠的 如图所示,新曲线是在现有曲线的基础上绘制的,这就是我想要解决的问题 这是我的一些代码:(如果我遗漏了一些部分,请告诉我) plot.cpp #include "plot.h" #include <qwt_plot.h> #include &

这是我在这里的第一个问题,我相信我没有看到任何人问这个具体问题,但我目前正在处理的是一个qwt图,不想回答

我要执行的操作:调用replot()方法以清除当前绘图

我的问题:调用replot()时,不会清除我的当前绘图,并且我的绘图是相互重叠的

如图所示,新曲线是在现有曲线的基础上绘制的,这就是我想要解决的问题

这是我的一些代码:(如果我遗漏了一些部分,请告诉我)

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();
}
#包括“plot.h”
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
类曲线数据:公共QWTARRAYSERESDATA
{
公众:
曲线数据()
{
}
虚拟QRectF boundingRect()常量
{
if(d_boundingRect.width()<0.0)
d_boundingRect=qwtBoundingRect(*此项);
返回d_boundingRect;
}
内联void追加(常量QPointF&point)
{
d_样本+=点;
}
无效清除()
{
d_样本。清除();
d_样本。挤压();
d_boundingRect=QRectF(0.0,0.0,-1.0,-1.0);
}
};
绘图::绘图(QWidget*父项):
QwtPlot(父级)
{
d_directPainter=新的QwtPlotDirectPainter(本);
setAutoReplot(假);
setAxisScale(QwtPlot::yLeft,0.014,0.016);
setAxisScale(QwtPlot::xBottom,0,1000);
d_曲线=新的QwtPlotCurve();
d_曲线->设置数据(新曲线数据());
d_曲线->附加(此);
}
无效绘图::追加点(常量QPointF和点)
{
CurveData*data=static_cast(d_曲线->数据());
数据->追加(点);
}
void Plot::DrawCurveSegment()
{
CurveData*data=static_cast(d_曲线->数据());
d_directPainter->drawSeries(d_曲线,数据->尺寸()-11,数据->尺寸()-1);
}
void Plot::ClearPlot()
{
CurveData*data=static_cast(d_曲线->数据());
数据->清除();
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();
}
MainWindow::MainWindow(QWidget*父项):
QWidget(父级)
{
d_图=新图();
计数器=0;
循环计数器=0;
// ... //
}
void主窗口::timerEvent(QTimerEvent*){
如果(计数器>0&&计数器%1000==0)
{
d_plot->ClearPlot();
d_plot->replot();
loopCounter++;

qDebug()我通过将clearPlot方法更改为以下方式解决了问题:

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

    QwtPlot::replot();
    QwtPlot::repaint();
}
void Plot::ClearPlot()
{
CurveData*data=static_cast(d_曲线->数据());
数据->清除();
QwtPlot::replot();
QwtPlot::repaint();
}
您也可以这样做:

QwtPlot::detachItems(QwtPlotItem::Rtti_PlotItem, true);

尝试使用
QwtPlotCurve::setData
设置新的空
CurveData
,而不是清除您不拥有的
QwtPlotCurve::data
对象。旧的
CurveData
将自动删除。这可能解决我的replot()问题吗?也许你可以看到它,但我尝试使用qwt实时和示波器示例作为指导。还发现,如果设置为true,则不必重新绘制,它具有相同的效果。