Qwt - 重新绘制不清除当前绘图

Posted

技术标签:

【中文标题】Qwt - 重新绘制不清除当前绘图【英文标题】:Qwt - replot does not clear current plot 【发布时间】:2014-03-17 16:09:39 【问题描述】:

这是我在这里的第一个问题,我相信我还没有看到其他人提出这个具体问题,但我目前正在处理的是一个不想重新绘制的 qwt 图。

我想做的事:调用replot()方法清除我当前的情节。

我的问题:当调用 replot() 并没有清除我当前的情节并且我的情节被绘制在彼此之上时。

Here is a link to an image of my problem

从图中可以看出,新曲线是在现有曲线之上绘制的,这就是我要解决的问题。

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

绘图.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();

主窗口.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();

如果有人能看出我做错了什么,将不胜感激。

最好的问候!

【问题讨论】:

尝试使用QwtPlotCurve::setData 设置新的空CurveData,而不是清除您不拥有的QwtPlotCurve::data 对象。旧的CurveData 将被自动删除。 这可能解决我的 replot() 问题吗?也许您可以看到它,但我正在尝试使用 qwt 实时和示波器示例作为指导。 【参考方案1】:

我通过将 clearPlot 方法更改为以下方法解决了这个问题:

void Plot::ClearPlot()

    CurveData *data = static_cast<CurveData *>(d_curve->data());
    data->clear();

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

【讨论】:

还发现ImmediatePaint设置为true就不用重绘了,效果是一样的。【参考方案2】:

你也可以这样做:

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

【讨论】:

以上是关于Qwt - 重新绘制不清除当前绘图的主要内容,如果未能解决你的问题,请参考以下文章

qwt 在重新缩放或缩放光标后绘制移动曲线

Qwt 追加点到绘图

Qwt 仅重新绘制特定区域

Qwt 图没有重新绘制

Qwt 重新缩放轴

如何清除 CGContextRef?