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


QWT: Replot without removing the previous points

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

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

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

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


解决方案是使用directPainter。
按照 QWT 的实时示例,我执行了以下操作:

首先我创建了辅助类 CurveData.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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 );
  }
};

然后是我的绘图代码:

1
2
3
4
5
6
7
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
2
m_vctTime.append(xTime);
m_vctValue.append(yPower);

然后

1
2
3
4
curve->setSamples(m_vctTime,m_vctValue);
curve->attach(plot);
plot->updateAxes();    
plot->replot();