如何加快从<qreal>C++到 QML 公开的对 QList 的访问

How to speed up access to QList<qreal> exposed from C++ to QML

本文关键字:访问 QList QML C++ 何加快 lt qreal gt      更新时间:2023-10-16

我在访问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。

文档对此

进行了一些说明:

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

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

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

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

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

吹毛求疵:将void放在参数列表中是一种在C++中没有地位的C主义。在 C 中这样做的原因是 void foo() 等价于 void foo(...) 。C++的情况已不再如此。