2013-10-14 102 views
3

我有一些速度访问QList<qreal>属性的问题。 我宣布:如何加速访问QList <qreal>从C++暴露给QML

Q_PROPERTY(QList<qreal> circlePointsX READ circlePointsX NOTIFY circlePointsXChanged); 
QList<qreal> circlePointsX(void) const 
{ 
    return mCirclePointsX; 
} 

,并在QML文件,我做了

pArea.circlesPointsX = paintAreaHelper.circlePointsX; 

后,有些代码是由点读点:

var cPointsX = circlesPointsX; 
    var cPointsY = circlesPointsY; 

    var noOfPoints = circlesPointsX.length - 4; 
    for (var i = 0; i <= noOfPoints; i+=4) 
    { 
     ctx.moveTo(cPointsX[i], cPointsY[i]); 
     ctx.lineTo(cPointsX[i+1], cPointsY[i+1]); 
     ctx.lineTo(cPointsX[i+2], cPointsY[i+2]); 
     ctx.lineTo(cPointsX[i+3], cPointsY[i+3]); 
     ctx.lineTo(cPointsX[i], cPointsY[i]); 
    } 

当然属性的类型是var

property var circlesPointsX;@ 

和分配:

var cPointsX = circlesPointsX; 

不加快什么,因为它只是复制参考。

我放弃了它,并且对于每一次循环访问,都会调用C++方法。 我想从C++复制一次数据,并从“本地qml副本”访问它,而不是每次调用C++ getter。

+0

然后将它复制到一个生活在“代码隐藏JS文件”中的JS变量 - 访问可能变得更快(但请记住,.js文件中的变量不受任何更改通知等影响 - 它们是普通的JS数据)。 – mlvljr

回答

3

documentation揭示一些光在其上:

如果序列被公开为Q_PROPERTY,访问由索引序列中的任何值将导致序列数据要被从所述的QObject的属性读取,则一个读取发生。同样,修改序列中的任何值将导致序列数据被读取,然后修改将被执行,修改后的序列将被写回QObject的属性。

如果从Q_INVOKABLE函数返回序列,访问和变异便宜得多,因为没有QObject属性读取或写入;相反,C++序列数据是直接访问和修改的。

所以,你的解决方案是声明circlePointsX为:

Q_INVOKABLE QList<qreal> circlePointsX() const { return mCirclePointsX; } 

你应该放下circlePoints财产,或将其重命名为别的东西。

Nitpick:将void放在参数列表中是C-ism,它在C++中没有位置。它在C中的原因是void foo()相当于void foo(...)。 C++中不再是这种情况。