2

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

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

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

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

4

2 回答 2

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);
}

并且具有最小内存消耗的保持效果已准备就绪!

于 2012-05-11T15:50:57.667 回答
1

是为数据点使用数据容器并向它们附加一些值的最简单方法,您将获得所需的绘图

像这样:在某些方法中,你积累数据

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

进而

curve->setSamples(m_vctTime,m_vctValue);
curve->attach(plot);
plot->updateAxes();    
plot->replot();
于 2013-11-06T06:18:52.327 回答