Qt QMetaType::转换失败

Qt QMetaType::转换失败,qt,qmetatype,Qt,Qmetatype,我正在尝试使用QMetaType::convert将QJsonValue转换为另一个动态类型。首先,我测试了以下代码,将动态类型设置为QString,转换失败 QJsonValue value("test"); QString string; if (!QMetaType::convert(&value, QMetaType::QJsonValue, &string, QMetaType::QString)) { qDebug() << "failed"; }

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

QJsonValue value("test");
QString string;
if (!QMetaType::convert(&value, QMetaType::QJsonValue, &string, QMetaType::QString))
{
    qDebug() << "failed";
}
QJsonValue值(“测试”);
QString字符串;
if(!QMetaType::convert(&value,QMetaType::QJsonValue,&string,QMetaType::QString))
{

qDebug()我猜您一方面使用QMetaType系统和QVariant类来封装Qt数据类型,另一方面使用QJsonValue来封装JSON中的值

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
}

PS:QJsonValue::Type:字符串与QVariant::Type:字符串(QMetaType::QString)不同,因此它们之间没有关系。

很抱歉回复得太晚。很遗憾,您的解决方案帮不上忙,因为我需要转换已知类型(QJsonObject或QVariant)由QMetaType::type参数确定的动态类型。我想做的是类似于.net mvc操作中的模型绑定。因此,我需要一个像QMetaType::convert这样的转换器函数,其类型参数是枚举而不是模板。根据您的建议,“QMetaType::convert只能处理QVariant数据”,我测试了QMetaType::hasRegisteredConverterFunction(QMetaType::QVariant,QMetaType::QVariant),最终结果为false。奇怪。
qDebug() << QMetaType::hasRegisteredConverterFunction(QMetaType::Int, QMetaType::Int);
// 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"