2017-06-05 9 views
0

QMetaType :: convertを使用して、QJsonValueを別の動的タイプに変換しようとしています。最初は、次のコードをQStringに動的型の設定でテストしましたが、変換に失敗しました。QMetaType :: convert failed

QJsonValue value("test"); 
QString string; 
if (!QMetaType::convert(&value, QMetaType::QJsonValue, &string, QMetaType::QString)) 
{ 
    qDebug() << "failed"; 
} 

次に、この静的メソッドが、メタシステムに2つのメタタイプ間で登録された変換があるかどうかを確認することがわかりました。残念ながら、結果は偽でした。たぶん、QJsonValueは非常に複雑でQJsonValueからQStringへの変換はサポートされていません。最後に、私はこれを試みたが、結果はまだ偽だった:それは奇妙だ

qDebug() << QMetaType::hasRegisteredConverterFunction(QMetaType::Int, QMetaType::Int); 

、Qtは、基本的なメタ型間の変換機能を実装していない用量であるように思われます。また、QMetaType :: registerConverterを使用して、2つの基本的なメタタイプ間でコンバータ関数を登録することはできません。

Qt dosen'tが基本的なメタタイプ間の変換を実装しているとは思えません。私が見逃した初期設定や.pro設定はありますか?

答えて

0

QMetaTypeシステムと、Qtデータ型をカプセル化するQVariantクラスと、一方でJSONの値をカプセル化するQJsonValueがあると思います。

QMetaType :: convertはQVariantデータのみを扱うことができます。あなたができることは、QJsonValueからQVariantを抽出し、QMetaTypeシステムを使用してQStringであることを知っているデータを変換することです。

// Your code 
QJsonValue value("test"); 
QString string ; 
if (!QMetaType::convert(&value, QMetaType::QJsonValue, &string, QMetaType::QString)) 
{ 
    qDebug() << "failed"; 
} 

// Extract the QVariant data 
QVariant variant = value.toVariant() ; 

// Two way to test conversion between QVariant and a type 
qDebug() << "canConvert template:" << variant.canConvert<QString>() << endl 
     << "canConvert parameter:" << variant.canConvert(QMetaType::QString) ; 
if(variant.canConvert<QString>()) 
{ 
    // Convert using QVariant methods 
    qDebug() << "QVariant toString:" << variant.toString() ; 

    // Convert Using QJsonValue methods 
    qDebug() << "QJsonValue toString:" << value.toString() ; // It's just a string representation of the data, not the actual data 
} 

出力:

failed 
canConvert template: true 
canConvert parameter: true 
QVariant toString: "test" 
QJsonValue toString: "test" 

PS:QJsonValue ::型:文字列::タイプQVariant異なる:文字列(QMetaType :: QStringの)ので、それらの間には関係がありません。

+0

ご迷惑をおかけします。残念ながら、既知の型(QJsonObjectまたはQVariant)をQMetaType :: Type引数で決定される動的型に変換する必要があるため、解決策は役に立ちません。私がやるべきことは、.net mvcのアクション内でのモデルバインディングのようなものです。したがって、QMetaType :: convertのような変換関数が必要です。その型パラメータはenumテンプレートではありません。 "QMetaType :: convertはQVariantデータのみを処理できます"というアドバイスによると、QMetaType :: hasRegisteredConverterFunction(QMetaType :: QVariant、QMetaType :: QVariant)をテストしたところ、最終結果はfalseでした。奇妙な。 – wxfred