QWT: Replot without removing the previous points
我正在使用 QWT 6,我试图每秒绘制一些点。为此,我使用以下代码:
1 2 | d_plot_dots->setRawSamples(_realDataPoints, _imagDataPoints, size); plot->replot(); |
我想支持暂停选项,因此前几秒的点在绘图中仍然可见。对此的一种解决方案是每秒调整保存点的数组的大小,附加新值并再次调用
有没有更有效的方法?
提前致谢!
解决方案是使用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(); |