2013-10-14 100 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++中不再是這種情況。