如何在 C++ 的 QML 对象上设置 QJSValue 类型的 属性?
How do I set a property of type QJSValue on a QML object from C++?
我有一个 QQuickItem
对应于一个 MapPolyline
对象。多段线有一个名为 path
的 属性,它在文档中定义为 list<coordinate>
类型。 coordinate
是一种映射到 C++ 世界中的 QGeoCoordinate
的类型。我正在尝试弄清楚如何从 C++ 中设置此 属性 的值。
如果我检查项目的 QMetaObject
并查找它为 path
属性 报告的类型,它表明类型为 QJSValue
。我不清楚如何使用 QObject::setProperty()
或 QQmlProperty::write()
从 C++ 设置此值。我试过以下方法:
我尝试创建一个 QJSValue
数组类型,每个元素都包含我想要的坐标值,如下所示:
void set_property_points(QQuickItem *item, const QVector<QGeoCoordinate> &pointList)
{
// Get the QML engine for the item.
auto engine = qmlEngine(item);
// Create an array to hold the items.
auto arr = engine->newArray(pointList.size());
// Fill in the array.
for (int i = 0; i < pointList.size(); ++i) arr.setProperty(i, engine->toScriptValue(pointList[i]));
// Apply the property change.
item->setProperty("path", arr.toVariant());
}
这没用;调用 setProperty()
returns false
.
我还尝试将点列表填充到 QVariantList
中,这似乎是我在 C++ 中为 list<coordinate>
(QGeoCoordinate
可以放在 QVariant
):
/// Apply a list of `QGeoCoordinate` points to the specified `QQuickItem`'s property.
void set_property_points(QQuickItem *item, const QVector<QGeoCoordinate> &pointList)
{
QVariantList list;
for (const auto &p : pointList) list.append(QVariant::fromValue(p));
item->setProperty("path", list);
}
这也没有用;同样的结果。
这个过程似乎没有很好的记录。我需要将数据放入什么格式才能使这项工作正常进行?
事实证明,文档中未提及的第三种方法似乎确实有效。我需要像这样设置 属性:
QJSValue arr; // see above for how to initialize `arr`
item->setProperty("path", QVariant::fromValue(arr));
我有一个 QQuickItem
对应于一个 MapPolyline
对象。多段线有一个名为 path
的 属性,它在文档中定义为 list<coordinate>
类型。 coordinate
是一种映射到 C++ 世界中的 QGeoCoordinate
的类型。我正在尝试弄清楚如何从 C++ 中设置此 属性 的值。
如果我检查项目的 QMetaObject
并查找它为 path
属性 报告的类型,它表明类型为 QJSValue
。我不清楚如何使用 QObject::setProperty()
或 QQmlProperty::write()
从 C++ 设置此值。我试过以下方法:
我尝试创建一个
QJSValue
数组类型,每个元素都包含我想要的坐标值,如下所示:void set_property_points(QQuickItem *item, const QVector<QGeoCoordinate> &pointList) { // Get the QML engine for the item. auto engine = qmlEngine(item); // Create an array to hold the items. auto arr = engine->newArray(pointList.size()); // Fill in the array. for (int i = 0; i < pointList.size(); ++i) arr.setProperty(i, engine->toScriptValue(pointList[i])); // Apply the property change. item->setProperty("path", arr.toVariant()); }
这没用;调用
setProperty()
returnsfalse
.我还尝试将点列表填充到
QVariantList
中,这似乎是我在 C++ 中为list<coordinate>
(QGeoCoordinate
可以放在QVariant
):/// Apply a list of `QGeoCoordinate` points to the specified `QQuickItem`'s property. void set_property_points(QQuickItem *item, const QVector<QGeoCoordinate> &pointList) { QVariantList list; for (const auto &p : pointList) list.append(QVariant::fromValue(p)); item->setProperty("path", list); }
这也没有用;同样的结果。
这个过程似乎没有很好的记录。我需要将数据放入什么格式才能使这项工作正常进行?
事实证明,文档中未提及的第三种方法似乎确实有效。我需要像这样设置 属性:
QJSValue arr; // see above for how to initialize `arr`
item->setProperty("path", QVariant::fromValue(arr));