我正在尝试使用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设置?
发布于 2017-06-05 22:39:24
我猜您一方面有QMetaType系统和QVariant类来封装Qt数据类型,另一方面有QJsonValue来封装JSON中的值。
转换只能处理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)不同,所以它们之间没有关系。
https://stackoverflow.com/questions/44364765
复制相似问题