在 QML 中读取 QList<QPoint>
Posted
技术标签:
【中文标题】在 QML 中读取 QList<QPoint>【英文标题】:Reading a QList<QPoint> in QML 【发布时间】:2017-08-08 18:03:27 【问题描述】:我有以下类定义:
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
)?
【问题讨论】:
【参考方案1】:是的,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
派生类型中,您实现一个接口来获取列表的大小和给定索引处的各个点。
您基本上为点列表实现了一个独立的访问器/操纵器。一切就绪。
我还 strongly recommend 说你在这种情况下使用 QVector
而不是 QList
。
class PlaneGridQML : public QObject
Q_OBJECT
........
Q_INVOKABLE QPoint get(int i) return planesPoints[i];
...
...
console.log(PlaneGrid.get(0).x)
如果你只有一个平面网格和一组点,你甚至不需要将不透明指针传递给 QML,你可以直接使用平面网格通过索引获取大小和单个元素。轻松愉快。
【讨论】:
我认为 QListAccessor.get(listVar, index)
中会是这样的,在 C++ 中你会像 listVar.value<QList<QPoint>*>()->at(index)
这样。但同样,不要使用QList
:)【参考方案2】:
您可以将QPoint
公开给QML,但不能公开QList<QPoint>
。
对于您的问题,我看到了三种可能的解决方案:
-
为
PlaneGridQML::planesPointsChanged
信号添加参数。您不能公开QList<QPoint>
,但可以发送两个QList<qreal>
类型的变量作为信号参数。一个列表可以包含 x
值和另一个 y
值。
实现int PlaneGridQML::getPlanesPointsCount()
和QPoint PlaneGridQML::getPlanesPoint(int index)
。所以你有两个函数 - 一个返回有多少点,第二个返回每个索引的点。
创建一个新类,该类将包含两个变量(planePointX
、planePointY
)并返回QQmlListProperty<NewClass>
和PlaneGridQML::getPlanesPoints
。但是,对于您的情况(太复杂),这种方法并不是一个好主意。 More info。
【讨论】:
以上是关于在 QML 中读取 QList<QPoint>的主要内容,如果未能解决你的问题,请参考以下文章
在 Qml 代码中编辑 C++ QList<Object*> 模型的问题和一些 Qml 警告