The*_*ist 2 c++ qt pointers class qwt
在此页面中:
http://qwt.sourceforge.net/class_qwt_plot_curve.html#afd13c94e23520dacbc37b4d0fd036a8b
方法
void QwtPlotCurve::setRawSamples()
Run Code Online (Sandbox Code Playgroud)
只需保存QwtPlotCurve中的数据地址,这正是我想要的效率.
而:
void QwtPlotCurve::setSamples()
Run Code Online (Sandbox Code Playgroud)
使用QVector,更方便.但它只是"明确分享".那是什么意思?像第一个一样保存指针吗?
我需要每50毫秒添加一个点.深度复制数据不是最好的解决方案!建议?
它与Qt的"隐性共享"概念并列:
http://doc.qt.io/archives/qt-4.7/implicit-sharing.html
即使您通过值传递QVector数据作为Qt中的参数,它也不会立即复制内存.如果其中一个向量发生变化,它只会复制.
我本以为在setSamples案例中说"显式共享"的文档只是为了引起人们注意你通过引用而不是通过值传递QVectors这一事实:
void QwtPlotCurve::setSamples(
const QVector< double > &xData,
const QVector< double > &yData
)
Run Code Online (Sandbox Code Playgroud)
而且我也会认为他们这样做是为了如果你改变矢量中的数据(或释放它),它将影响绘图曲线所保持的数据.如果您认为向量是按值传递的(您无法判断您是否只是在阅读调用点),那么您并不期望这样做.
然而,看看源代码,看起来无论如何它只是制作一个隐式共享的副本.在qwt_plot_curve.cpp中,我们有:
/*!
\brief Initialize data with x- and y-arrays (explicitly shared)
\param xData x data
\param yData y data
\sa QwtPointArrayData
*/
void QwtPlotCurve::setSamples( const QVector<double> &xData,
const QVector<double> &yData )
{
setData( new QwtPointArrayData( xData, yData ) );
}
Run Code Online (Sandbox Code Playgroud)
我们可以看到QwtPointArrayData在qwt_point_data.h中声明如下:
class QWT_EXPORT QwtPointArrayData: public QwtSeriesData<QPointF>
{
public:
QwtPointArrayData( const QVector<double> &x, const QVector<double> &y );
QwtPointArrayData( const double *x, const double *y, size_t size );
virtual QRectF boundingRect() const;
virtual size_t size() const;
virtual QPointF sample( size_t i ) const;
const QVector<double> &xData() const;
const QVector<double> &yData() const;
private:
QVector<double> d_x;
QVector<double> d_y;
};
Run Code Online (Sandbox Code Playgroud)
qwt_point_data.cpp中构造函数的代码只是对d_xand 的简单赋值d_y.这可以追溯到普通的"隐性共享".因此,您在传入的数据中所做的更改将不会被图表看到; 您将支付在此类修改时制作的副本.
如果他们只是要这样做,那么为什么他们打扰传递const引用(而不仅仅是值)对我来说是一个谜.这里唯一的"共享"似乎是隐含的,所以我不知道"明确共享"的评论是什么意思.