2012-05-03 62 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(); 
相關問題