我有以下类定义:

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有效,所以不一定意味着也可以。

这是QML支持的列表中的自动类型的列表:

QList<int>
QList<qreal>
QList<bool>
QList<QString> and QStringList
QList<QUrl>
QVector<int>
QVector<qreal>
QVector<bool>


如您所见,QList<QPoint>不是其中之一。

QPoint包装将是浪费。

但是不要绝望。我建议您将QObject声明为元类型,然后可以将其包装在QList<QPoint> *中以将其作为指向QML的不透明指针传递。然后,在您的QVariant或其他单个PlaneGridQML派生类型中,实现一个接口以获取列表的大小以及给定索引处的单个点。

基本上,您为点列表实现了一个独立的访问器/操纵器。你们都准备好了。

我也strongly recommend在这种情况下,您使用QObject而不是QVector

class PlaneGridQML : public QObject
{
    Q_OBJECT
    ........
    Q_INVOKABLE QPoint get(int i) { return planesPoints[i]; }
    ...
}
...
console.log(PlaneGrid.get(0).x)


如果只有一个平面网格和一组点,甚至不需要将不透明的指针传递给QML,则可以直接使用平面网格通过索引获取大小和单个元素。十分简单。

09-04 17:40