我正在使用QWT 6,我试图每秒绘制一些点。为此,我使用以下代码:
d_plot_dots->setRawSamples(_realDataPoints, _imagDataPoints, size);
plot->replot();
我想支持一个保持选项,因此前几秒的点在图中仍然可见。对此的一个解决方案是每秒调整持有点的数组的大小,附加新值并再次调用setRawSamples()
和replot()
,但这个解决方案不是内存效率,因为我每秒都有存储至少2 * 2048点。
有没有更有效的方法? 提前谢谢!
答案 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();