2016-10-14 15 views
0

QJsonObjectを使用してJSONでデータを受信しました。私はまた、Q_PROPERTY(...)を使用して、QObjectベースのオブジェクト保持プロパティをJSONのキーに持っています。 QtはJSONよりもいくつかのデータ型を持っているので、どのように変換可能かどうかを調べることができます。オブジェクトで使用QVariantが他のQVariantタイプに変換可能かどうかを確認

データ型は、通常、次の1ですが、

uint 
double 
QString 
QDateTime 
bool 

に限られるものではないという考えは、自動的にQJsonObjectの全てのキー/値のためQOject派生オブジェクトにsetProperty(...)を呼び出すことです。これはJSONの不正な入力のために失敗する可能性があるので、私はQMetaPropertyQJsonObject/QVariantMapのデータに基づいて妥当性をチェックする必要があります。

これは、すべてのデータ型の手動チェックを実装する基本クラスとして汎用を実行するので失敗します。私は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()); 
} 

は、私は本当に私の元のオブジェクトを変更せずに、すでにそこにこれらをキャッチしたいです。以下のような何か:

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

実際には最後の行に解決策が見つかりました。「bool QVariant :: canConvert(int targetTypeId) 'があります。 –

答えて

2

代わりのテンプレートbool QVariant::canConvert<T>() 1はbool QVariant::canConvert(int targetTypeId)ものを使用します。

QMetaProperty po = staticMetaObject->property(staticMetaObject->propertyOffset()); 
jo["test"].toVariant().canConvert(po.type()); 
関連する問題