[英]Reading a QList<QPoint> in QML
我有以下類定義:
class PlaneGridQML : public QObject
{
Q_OBJECT
........
Q_INVOKABLE QList<QPoint> getPlanesPoints() {
return m_PlaneGrid.getPlanesPoints();
......
}
我主要是將其提供給QML引擎
PlaneGridQML pgq(10, 10, 3, false);
engine.rootContext()->setContextProperty("PlaneGrid",&pgq);
然后在QML組件中,我想執行以下操作:
Connections {
target: PlaneGrid
onPlanesPointsChanged: {
var pointsArray = PlaneGrid.getPlanesPoints()
console.log(pointsArray[0].x)
}
}
我收到錯誤消息“未知的方法返回類型:QList”,顯然我無法讀取pointsArray並顯示其第一個成員。 根據Qt文檔,QPoint可以直接轉換為JS類型。 另一方面, QPoint
不是從QObject
派生的。
誰能解釋一下如何在JS函數中列出數組的元素( QPoints
)?
是的, QPoint
將自動轉換為QML,甚至某些對象的QList
也將自動轉換為QML,但是僅僅因為QList<int>
起作用並且QPoint
起作用,所以不一定意味着QList<QPoint>
也會起作用。
這是QML支持的列表中的自動類型的列表:
QList<int>
QList<qreal>
QList<bool>
QList<QString> and QStringList
QList<QUrl>
QVector<int>
QVector<qreal>
QVector<bool>
如您所見, QPoint
不是其中之一。
包裝在QObject
中將是浪費。
但是不要絕望。 我建議您將QList<QPoint> *
聲明為元類型,然后可以將其包裝在QVariant
以將其作為指向QML的不透明指針傳遞。 然后,在PlaneGridQML
或其他單個QObject
派生類型中,實現一個接口以獲取列表的大小以及給定索引處的單個點。
基本上,您為點列表實現了一個獨立的訪問器/操縱器。 你們都准備好了。
我也強烈建議您在這種情況下使用QVector
而不是QList
。
class PlaneGridQML : public QObject
{
Q_OBJECT
........
Q_INVOKABLE QPoint get(int i) { return planesPoints[i]; }
...
}
...
console.log(PlaneGrid.get(0).x)
如果只有一個平面網格和一組點,甚至不需要將不透明指針傳遞給QML,則可以直接使用平面網格通過索引獲取大小和單個元素。 十分簡單。
您可以將QPoint
暴露給QML,但不能暴露給QList<QPoint>
。 對於您的問題,我看到了三種可能的解決方案:
PlaneGridQML::planesPointsChanged
信號。 您不能公開QList<QPoint>
但是可以發送QList<qreal>
類型的兩個變量作為信號參數。 一個列表可以包含x
值,另一個可以包含y
值。 int PlaneGridQML::getPlanesPointsCount()
和QPoint PlaneGridQML::getPlanesPoint(int index)
。 因此,您有兩個函數-一個函數返回有多少個點,第二個函數為每個索引返回一個點。 planePointX
, planePointY
),並使用PlaneGridQML::getPlanesPoints
返回QQmlListProperty<NewClass>
。 但是,這種方法對於您的案例而言並不是一個好主意(太復雜了)。 更多信息 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.