QWT: Replot sin eliminar los puntos anteriores

Estoy usando QWT 6 y estoy tratando de trazar algunos puntos cada segundo. Para ello utilizo el siguiente código:

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

Quiero admitir una opción de espera, para que los puntos de los segundos anteriores sigan siendo visibles en la trama. Una solución a esto es cambiar el tamaño cada segundo de las matrices que contienen los puntos, agregar los nuevos valores y volver a llamar al setRawSamples() y replot(), pero esta solución no es eficiente en memoria ya que cada segundo tengo que almacenar al menos 2 * 2048 puntos.

¿Hay alguna forma más eficiente? ¡Gracias por adelantado!

preguntado el 03 de mayo de 12 a las 12:05

2 Respuestas

La solución a eso fue el uso de directPainter. Siguiendo el ejemplo en tiempo real del QWT, hice lo siguiente:

Primero creé la clase auxiliar 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 );
  }
};

Y luego en mi código de trazado:

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

¡Y el efecto de espera con un consumo mínimo de memoria está listo!

Respondido el 12 de diciembre de 14 a las 08:12

es la forma más sencilla de usar contenedores de datos para sus puntos de datos y, al agregarles algún valor, obtendrá el gráfico que necesita

algo como esto: en algún método acumulas datos

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

y entonces

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

respondido 06 nov., 13:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.