2016-10-14 2 views
0

QJsonObject을 사용하여 JSON으로 데이터를 수신합니다. 또한 QObject 기반의 객체 보유 속성이 있으며 Q_PROPERTY(...)을 사용하여 JSON의 키에 사용됩니다. Qt에는 JSON보다 더 많은 데이터 유형이 있기 때문에 어떻게 변환 할 수 있는지 확인할 수 있습니다. 객체에 사용QVariant가 다른 QVariant 유형으로 변환 가능한지 확인하십시오.

데이터 유형은 일반적으로 다음 중 하나지만 아이디어는 자동으로 QJsonObject의 모든 키/값에 대한 QOject 파생 된 개체에 setProperty(...)를 호출하는 것입니다

uint 
double 
QString 
QDateTime 
bool 

에 제한되지 않는다. JSON에서 잘못된 형식의 입력으로 인해 실패 할 수 있으므로 QMetaPropertyQJsonObject/QVariantMap 데이터를 기반으로 유효성을 확인해야합니다.

모든 데이터 형식에 대해 수동 검사를 구현하는 기본 클래스로 generic을 실행해야하므로 실패합니다. QVariant::isConvertible<T>()이 있다는 것을 알고 있습니다. 모든 속성은 JSON 객체에 해당 키가 것인지 확인하기 전에 내가 JSON을 구문 분석하고 있기 때문에

#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()); 
} 

은 정말 내 원래 객체를 변경하지 않고 이미 이러한 잡을 것을 좋아합니다. 대신 bool QVariant::canConvert<T>() 하나 bool QVariant::canConvert(int targetTypeId)를 사용할 수있는 템플릿 사용

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

실제로 마지막 줄에서 해결책을 찾았습니다. 'bool QVariant :: canConvert (int targetTypeId)'... –

답변

2

:처럼 뭔가.

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