Я использую сериализацию свойства 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.
Как определить пользовательское преобразование типов для читабельной сериализации типов?