3#include <QJSManagedValue>
17inline QJSValue variantToJs(QJSEngine& engine,
const QVariant& v);
21template <
typename Map>
22inline QJSValue mapToJs(QJSEngine& engine,
const Map& map)
24 QJSManagedValue obj(engine.newObject(), &engine);
25 for(
auto it = map.cbegin(); it != map.cend(); ++it)
26 obj.setProperty(it.key(), variantToJs(engine, it.value()));
27 return obj.toJSValue();
30template <
typename List>
31inline QJSValue listToJs(QJSEngine& engine,
const List& list)
33 QJSManagedValue arr(engine.newArray(uint(list.size())), &engine);
34 for(qsizetype i = 0; i < list.size(); i++)
36 if constexpr(std::is_same_v<typename List::value_type, QString>)
37 arr.setProperty(quint32(i), QJSValue(list[i]));
39 arr.setProperty(quint32(i), variantToJs(engine, list[i]));
41 return arr.toJSValue();
45inline const T& get(
const QVariant& v)
noexcept
47 return *
static_cast<const T*
>(v.constData());
51inline QJSValue variantToJs(QJSEngine& engine,
const QVariant& v)
53 switch(v.metaType().id())
55 case QMetaType::Double:
56 return QJSValue(detail::get<double>(v));
58 return QJSValue(detail::get<int>(v));
60 return QJSValue(detail::get<bool>(v));
61 case QMetaType::QString:
62 return QJSValue(detail::get<QString>(v));
63 case QMetaType::QVariantList:
64 return detail::listToJs(engine, detail::get<QVariantList>(v));
65 case QMetaType::QStringList:
66 return detail::listToJs(engine, detail::get<QStringList>(v));
67 case QMetaType::QVariantMap:
68 return detail::mapToJs(engine, detail::get<QVariantMap>(v));
69 case QMetaType::QVariantHash:
70 return detail::mapToJs(engine, detail::get<QVariantHash>(v));
74 if(v.metaType() == QMetaType::fromType<QJSValue>())
75 return variantToJs(engine, detail::get<QJSValue>(v).toVariant());
76 return engine.toScriptValue(v);