QWT: Replot sin eliminar los puntos anteriores
Frecuentes
Visto 1,963 veces
2
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!
2 Respuestas
2
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
1
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 qwt or haz tu propia pregunta.