我使用这样的QObject属性序列化:
QMetaProperty metaProperty = obj->metaObject()->property(i);
QString attrName = metaProperty.name();
QVariant attrValue = metaProperty.read(obj);
serializedJson.insert("name", attrName);
serializedJson.insert("value", attrValue.toString());
但是QVariant::toString((方法在处理float
属性时有一些不正确的行为:代码
float f = 0.0001;
qDebug() << QVariant(f).toString();
qDebug() << QVariant(f).value<QString>();
打印:
"9.999999747378752e-05"
"9.999999747378752e-05"
好的,我知道,有一个很好的QString::number((方法,
float f = 0.0001;
qDebug() << QString::number(f);
这给了我:
"0.0001"
但我不想使代码复杂化:
QMetaProperty metaProperty = obj->metaObject()->property(i);
QString attrName = metaProperty.name();
QVariant attrValue = metaProperty.read(obj);
QString stringified = "";
// special handling of float properties !
if (attrValue.type() == static_cast<QVariant::Type>(QMetaType::Float))
stringified = QString::number(attrValue.toFloat());
else
stringified = attrValue.value<QString>();
serializedJson.insert("name", attrName);
serializedJson.insert("value", stringified );
然后我尝试注册自己的转换器:
QMetaType::registerConverter<float, QString>(Converters::floatToString);
不幸的是,Qt给了我一个错误:
Error : static assertion failed: QMetaType::registerConverter: At least one of the types must be a custom type.
如何定义用于人类可读类型序列化的自定义类型转换?
您正在尝试注册已经注册的float
和QString
类型,因此出现错误:
静态断言失败:
QMetaType::registerConverter
:至少有一个类型必须是自定义类型。
请参阅文档中支持的类型列表。
一种解决方案可以是扩展QString
以创建自定义类型。
这里有一个例子:
#include <QDebug>
#include <QString>
#include <QVariant>
#include <QMetaType>
struct FQString final : QString
{
using QString::operator=;
static QString convert( const float f )
{
return QString::number( f );
}
};
Q_DECLARE_METATYPE( FQString );
int main()
{
QMetaType::registerConverter<float, FQString>( FQString::convert );
const float f = 0.0001;
const QVariant v( f );
const QString s = v.value<FQString>();
qDebug() << "Value:" << s;
return 0;
}
输出:
Value: "0.0001"
有了这个解决方案,你可以为你的代码写这样的东西:
QString stringified = attrValue.value<FQString>();