3

我在访问QList<qreal>财产的速度方面遇到了一些问题。我已经宣布:

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。

4

1 回答 1

3

文档对此进行了一些说明:

如果序列作为 Q_PROPERTY 公开,则通过索引访问序列中的任何值将导致从 QObject 的属性中读取序列数据,然后发生读取。同样,修改序列中的任何值都会导致序列数据被读取,然后执行修改并将修改后的序列写回QObject的属性。

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

因此,您的解决方案是声明circlePointsX为:

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

您应该删除该circlePoints属性,或将其重命名为其他名称。

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

于 2013-10-14T20:35:59.237 回答