QMetaType::转换失败
Posted
技术标签:
【中文标题】QMetaType::转换失败【英文标题】:QMetaType::convert failed 【发布时间】:2017-06-05 08:27:49 【问题描述】:我正在尝试使用 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】:我猜你一方面有 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) 不同,所以它们之间没有关系。
【讨论】:
抱歉回复晚了。不幸的是,您的解决方案无济于事,因为我需要将已知类型(QJsonObject 或 QVariant)转换为由 QMetaType::Type 参数确定的动态类型。我想做的是在.net mvc 的操作中进行模型绑定。所以,我需要一个像 QMetaType::convert 这样的转换函数,它的类型参数是枚举而不是模板。根据您的“QMetaType::convert 只能处理 QVariant 数据”的建议,我测试了 QMetaType::hasRegisteredConverterFunction(QMetaType::QVariant, QMetaType::QVariant),最终结果为 false。很奇怪。以上是关于QMetaType::转换失败的主要内容,如果未能解决你的问题,请参考以下文章
使用带有 QDataStream 的自定义 QMetaType
将具有已知 QMetaType::Type 的 QByteArray 反序列化为 QVariant