Как установить свойство типа QJSValue для объекта QML из C++?
У меня есть QQuickItem
что соответствует MapPolyline
объект. У полилинии есть свойство, которое называется path
, который определен в документации, чтобы иметь тип list<coordinate>
, coordinate
это тип, который отображается на QGeoCoordinate
в мире C++. Я пытаюсь выяснить, как установить значение этого свойства из C++.
Если я проверю QMetaObject
для элемента и найдите тип, который он сообщает для path
свойство, это указывает на тип QJSValue
, Мне неясно, как я могу установить это значение из C++, используя либо QObject::setProperty()
или же QQmlProperty::write()
, Я пробовал следующее:
Я пытался создать
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()
возвращается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); }
Это тоже не сработало; те же результаты.
Этот процесс не выглядит хорошо документированным. В какой формат мне нужно поместить мои данные, чтобы эта работа работала?
1 ответ
Оказывается, что третий подход, который не упоминается в документации, действительно работает. Мне нужно было установить свойство следующим образом:
QJSValue arr; // see above for how to initialize `arr`
item->setProperty("path", QVariant::fromValue(arr));