如何加快从<qreal>C++到 QML 公开的对 QList 的访问
How to speed up access to QList<qreal> exposed from C++ to QML
我在访问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++的情况已不再如此。
相关文章:
- 通过方法访问结构
- 使用不带参数的函数访问结构元素
- 如果我只是不访问queue_front节点的子节点,而是将它们推到队列中呢?还是BFS吗
- 用于访问容器<T>数据成员的正确 API
- 访问者访问变体并返回不同类型时出错
- 尝试通过多个向量访问变量时,向量下标超出范围
- 无法访问嵌套类.类的使用无效
- 写入位置0x0000000C时发生访问冲突
- 我们可以访问一个不存在的联盟的成员吗
- C++从另一个类访问公共静态向量的正确方法是什么
- 访问类 QList 指针的成员
- 尝试在 qml 中访问结构成员的 QList
- 从 QWidgetList 访问 QWidget 子插槽/信号 (QList<QWidget*>)
- Qlist<QCameraInfo> 导致 QList 析构函数中的访问冲突
- 在 QList 中访问派生类时的最佳做法
- <T> 从 qml 访问 QList
- QT/QML c++ 程序在从 QML 访问 QList 时崩溃
- 如何加快从<qreal>C++到 QML 公开的对 QList 的访问
- Qt 应用程序在从 <QUrl>NetworkAccessManager->get() 回调访问 QList<QLlnkedList* >时冻结
- 访问QML中的QList对象