簡體   English   中英

讀取QList <QPoint> 在QML中

[英]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> 對於您的問題,我看到了三種可能的解決方案:

  1. 將參數添加到PlaneGridQML::planesPointsChanged信號。 您不能公開QList<QPoint>但是可以發送QList<qreal>類型的兩個變量作為信號參數。 一個列表可以包含x值,另一個可以包含y值。
  2. 實現int PlaneGridQML::getPlanesPointsCount()QPoint PlaneGridQML::getPlanesPoint(int index) 因此,您有兩個函數-一個函數返回有多少個點,第二個函數為每個索引返回一個點。
  3. 創建一個新類,其中將包含兩個變量( planePointXplanePointY ),並使用PlaneGridQML::getPlanesPoints返回QQmlListProperty<NewClass> 但是,這種方法對於您的案例而言並不是一個好主意(太復雜了)。 更多信息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM