Как установить свойство типа 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));
Другие вопросы по тегам