2016-10-14 4 views
0

Я получаю данные в JSON, используя QJsonObject. У меня также есть свойства размещения объектов на основе QObject, используя Q_PROPERTY(...), для ключей в JSON. Поскольку Qt теперь имеет несколько типов данных, чем JSON, как можно проверить, являются ли они конвертируемыми.Проверьте, разрешен ли QVariant на другой тип QVariant

Типы данных, используемые в объекте, как правило, являются одним из следующих, но не ограничиваясь

uint 
double 
QString 
QDateTime 
bool 

Идея заключается в том, чтобы автоматически вызывать setProperty(...) на QOject объект производного для каждого ключа/значения в QJsonObject. Поскольку это может завершиться неудачно из-за неправильного ввода в JSON, я должен проверить достоверность на основе данных QMetaProperty и QJsonObject/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-объект, который я очень хотел, чтобы поймать их там уже не меняя свой исходный объект. Что-то вроде:

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

На самом деле я нашел решение на последней строке ... Существует 'bool QVariant :: canConvert (int targetTypeId)' ... –

ответ

2

Вместо использования шаблонных bool QVariant::canConvert<T>() можно использовать bool QVariant::canConvert(int targetTypeId).

QMetaProperty po = staticMetaObject->property(staticMetaObject->propertyOffset()); 
jo["test"].toVariant().canConvert(po.type()); 
Смежные вопросы