繁体   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