QMetaType :: convert失败

时间:2017-06-05 08:27:49

标签: qt qmetatype

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

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设置?

1 个答案:

答案 0 :(得分: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 :: Type:String与QVariant :: Type:String(QMetaType :: QString)不同,所以它们之间没有任何关系。