检查QVariant是否可以转换为其他QVariant类型

时间:2016-10-14 13:32:40

标签: qt

我使用QJsonObject以JSON格式接收数据。我还有一个基于QObject的对象,使用Q_PROPERTY(...)为JSON中的键保存属性。由于Qt现在有比JSON更多的数据类型,因此如何检查它们是否可以转换。

对象中使用的数据类型通常是以下之一,但不限于

uint
double
QString
QDateTime
bool

我们的想法是针对setProperty(...)中的每个键/值,在QOject派生对象上自动调用QJsonObject。由于JSON输入格式错误可能会失败,因此我必须根据QMetaPropertyQJsonObject/QVariantMap数据检查有效性。

因为这应该作为基类运行泛型,实现每个数据类型的手动检查失败。我知道有QVariant::isConvertible<T>()

#include <QJsonObject>
#include <QVariant>
#include <QMetaObject>
#include <QMetaProperty>
class Test {
  Q_GADGET
  Q_PROPERTY(QString test)

  QString m_test;
  QJsonObject jo;

  void call();
}

void Test::call()
{
    jo.insert("test",QJsonValue(5));

    // This will fail, since int is not convertible to QString implicitly
    staticMetaObject->property(staticMetaObject->propertyOffset()).writeOnGadget(this,jo["test"].toVariant());
}

因为我之前正在解析JSON以检查每个属性是否在JSON-Object中都有相应的键我真的很想抓住它们而没有改变我的原始对象。类似的东西:

jo["test"].toVariant().canConvert<staticMetaObject->property(staticMetaObject->propertyOffset()).type()>()

1 个答案:

答案 0 :(得分:2)

不使用模板bool QVariant::canConvert<T>(),而是使用bool QVariant::canConvert(int targetTypeId)

QMetaProperty po = staticMetaObject->property(staticMetaObject->propertyOffset());
jo["test"].toVariant().canConvert(po.type());