[英]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.