diff --git a/openbr/core/qtutils.cpp b/openbr/core/qtutils.cpp index 87d64ce..239876c 100644 --- a/openbr/core/qtutils.cpp +++ b/openbr/core/qtutils.cpp @@ -27,6 +27,7 @@ #include #include #include +#include #include #include "alphanum.hpp" @@ -453,6 +454,78 @@ QStringList toStringList(const QMap &variantMap) return variants; } +QJsonValue fromVariant(const QVariant &variant) +{ + // Convert any formats that can be natively stored as JSON + if (variant.canConvert() || variant.canConvert() || variant.canConvert()) + return QJsonValue::fromVariant(variant); + + // If array, recurse + if (variant.canConvert()) { + QJsonArray jsonArray; + foreach (const QVariant &v, variant.toList()) + jsonArray.append(fromVariant(v)); + return QJsonValue(jsonArray); + } + + return QJsonValue(QtUtils::toString(variant)); +} + +QJsonObject fromVariantMap(const QVariantMap &variantMap) +{ + QJsonObject jsonObject; + QMap::const_iterator i; + for (i = variantMap.begin(); i != variantMap.end(); i++) + jsonObject.insert(i.key(), fromVariant(i.value())); + return jsonObject; +} + +QVariant fromJsonValue(const QJsonValue &value) +{ + QVariant variant; + QJsonValue::Type t = value.type(); + if (t == QJsonValue::Null) + return QVariant(); + else if (t == QJsonValue::Bool || t == QJsonValue::Double) + return value.toVariant(); + else if (t == QJsonValue::String) + return QtUtils::fromString(value.toString()); + else if (t == QJsonValue::Array) { + const QJsonArray array = value.toArray(); + QVariantList variantList; + foreach (const QJsonValue &arrayValue, array) + variantList.append(fromJsonValue(arrayValue)); + return variantList; + } else if (t == QJsonValue::Object) + return fromJsonObject(value.toObject()); + else // QJsonValue::Undefined + return QVariant(); +} + +QVariantMap fromJsonObject(const QJsonObject &object) +{ + QVariantMap variantMap; + foreach (const QString &key, object.keys()) + variantMap.insert(key, fromJsonValue(object.value(key))); + return variantMap; +} + +QVariant fromString(const QString &value) +{ + bool ok = false; + const QPointF point = QtUtils::toPoint(value, &ok); + if (ok) return point; + const QRectF rect = QtUtils::toRect(value, &ok); + if (ok) return rect; + const cv::RotatedRect rotatedRect = OpenCVUtils::rotateRectFromString(value, &ok); + if (ok) return QVariant::fromValue(rotatedRect); + const int i = value.toInt(&ok); + if (ok) return i; + const float f = value.toFloat(&ok); + if (ok) return f; + return value; +} + QString toTime(int s) { int h = s / (60*60); diff --git a/openbr/core/qtutils.h b/openbr/core/qtutils.h index f38d2d5..23d5763 100644 --- a/openbr/core/qtutils.h +++ b/openbr/core/qtutils.h @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -80,6 +81,11 @@ namespace QtUtils QString toString(const QVariantList &variantList); BR_EXPORT QString toString(const QVariantMap &QVariantMap); BR_EXPORT QStringList toStringList(const QVariantMap &QVariantMap); + BR_EXPORT QVariant fromString(const QString &value); + BR_EXPORT QJsonValue fromVariant(const QVariant &variant); + BR_EXPORT QJsonObject fromVariantMap(const QVariantMap &variantMap); + BR_EXPORT QVariant fromJsonValue(const QJsonValue &value); + BR_EXPORT QVariantMap fromJsonObject(const QJsonObject &object); template QVariantList toVariantList(const QList &list)