QWT:重新绘制而不删除之前的点

时间:2012-05-03 11:17:13

标签: qwt

我正在使用QWT 6,我试图每秒绘制一些点。为此,我使用以下代码:

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

我想支持一个保持选项,因此前几秒的点在图中仍然可见。对此的一个解决方案是每秒调整持有点的数组的大小,附加新值并再次调用setRawSamples()replot(),但这个解决方案不是内存效率,因为我每秒都有存储至少2 * 2048点。

有没有更有效的方法? 提前谢谢!

2 个答案:

答案 0 :(得分: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 :(得分:1)

是为数据点使用数据容器的最简单方法 和 为他们增加一些价值 你会得到你需要的情节

这样的事情: 在某种方法中,你积累数据

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

然后

curve->setSamples(m_vctTime,m_vctValue);
curve->attach(plot);
plot->updateAxes();    
plot->replot();