为QVariant指定非自定义类型转换器



我使用这样的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.

如何定义用于人类可读类型序列化的自定义类型转换?

您正在尝试注册已经注册的floatQString类型,因此出现错误:

静态断言失败: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>();

相关内容

  • 没有找到相关文章

最新更新