2012-05-03 64 views
2

我正在使用QWT 6,并且试图每秒钟绘制一些点。要做到这一点我使用下面的代码:QWT:在不删除前面的点的情况下重绘图

d_plot_dots->setRawSamples(_realDataPoints, _imagDataPoints, size); 
plot->replot(); 

我想支持选项保持,所以从以前的秒点是在剧情仍然可见。解决这个问题的方法是每隔一秒钟重新调整包含点的数组,然后附加新的值并再次调用setRawSamples()replot(),但是这种解决方案不具有内存效率,因为在每秒必须存储至少2 * 2048个点。

有没有更有效的方法? 在此先感谢!

回答

2

解决方案是使用directPainter。 继QWT的实时示例之后,我完成了以下操作:

首先,我创建了辅助类CurveData。

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 replace(double *x, double *y, int size) 
    { 
    if(d_samples.size() != size){ 
     d_samples.resize(size); 
    } 
    for(int i = 0; i < size; i++){ 
     d_samples.replace(i, QPointF(x[i], y[i])); 
    } 
    } 


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

然后在我的绘制代码:

void 
PlottingClass::plotHoldOnPoints(int size) 
{ 
    CurveData *data = static_cast<CurveData *>(d_curve->data()); 
    data->replace(_realDataPoints, _imagDataPoints, size); 
    d_direct_painter->drawSeries(d_curve, 0, data->size() -1); 
} 

而且与最低内存消耗的效果保持是准备好了!

1

是使用数据容器的数据点 和 一些附加价值,他们 您`ll有剧情需要

像这样一个simpliest方式: 一些方法,你积累的数据

m_vctTime.append(xTime); 
m_vctValue.append(yPower); 

然后

curve->setSamples(m_vctTime,m_vctValue); 
curve->attach(plot); 
plot->updateAxes();  
plot->replot(); 
相关问题