2017-06-05 97 views
0

我想使用QMetaType :: convert将QJsonValue转换为另一种动态类型。起初,我测试了以下代码,将动态类型设置为QString,转换失败。QMetaType ::转换失败

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

然后,我发现这个静态方法来检查元系统是否有两个元类型之间的注册转换。

qDebug() << QMetaType::hasRegisteredConverterFunction(QMetaType::QJsonValue, QMetaType::QString); 

不幸的是,结果是错误的。也许QJsonValue非常复杂,不支持从QJsonValue到QString的转换。最后,我想这一点,其结果仍然是假的:

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

很奇怪,好像是,Qt的剂量不会实现基本元类型之间的转换功能。而且,用户不能使用QMetaType :: registerConverter在两种基本元类型之间注册转换函数。

我还是不能相信Qt不会实现基本元类型之间的转换,有没有初始化或我错过的.pro设置?

回答

0

我想你一方面有QMetaType系统和QVariant类来封装Qt数据类型,另一方面是QJsonValue来封装JSON值。

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 ::类型:String距离的QVariant ::类型不同:字符串(QMetaType :: QString的),以便在它们之间没有任何关系。

+0

不好意思回复迟到。不幸的是,你的解决方案不能提供帮助,因为我需要将已知类型(QJsonObject或QVariant)转换为由QMetaType :: Type参数确定的动态类型。我想要做的就是在.net mvc的动作中模型绑定。所以,我需要一个像QMetaType :: convert这样的转换器函数,其类型参数是一个枚举而不是模板。根据您的建议,“QMetaType :: convert只能处理QVariant数据”,我测试了QMetaType :: hasRegisteredConverterFunction(QMetaType :: QVariant,QMetaType :: QVariant),最终结果是错误的。奇怪的。 – wxfred