将自定义 QMap 模板实例化以人类可读的形式保存在 QSettings 中

Save custom QMap template instantiation in QSettings in human-readable form

本文关键字:保存 存在 QSettings QMap 自定义 实例化 人类      更新时间:2023-10-16

在我的代码中,我使用 QSettings 机制将我自己的类MyClass保存在QMap<unsigned int, MyClass>中并将其加载到配置文件中。

我知道如何将自己的类型注册到 QMetaObject 中,以便我可以将它们与 QVariant 一起使用。这允许使用QSettings保存它们。请参阅下面的工作代码。

但是,在我正在写入的实际配置文件中,这些类型的表示形式绝不是人类可读的。有什么方法可以使自定义映射在文本编辑器中更具可读性,以便我可以在Qt之外手动更改配置?

将我的自定义类型保存到配置的代码:

struct MyClass
{
unsigned int id;
QString name;
QString value;
friend QDataStream & operator<< (QDataStream &arch, const MyClass& c)
{
return arch << c.id << c.name << c.value;
}
friend QDataStream & operator>> (QDataStream &arch, MyClass& c)
{
return arch >> c.id >> c.name >> c.value;
}
};
Q_DECLARE_METATYPE(MyClass)
typedef QMap<unsigned int, MyClass> MyMap;
int main(int argc, char *argv[])
{
MyMap map;
map.insert(100, {100, "name1", "value1"});
map.insert(101, {101, "name2", "value2"});
map.insert(200, {200, "name3", "value3"});
qRegisterMetaTypeStreamOperators<MyMap>("MyMap");
QSettings conf("/home/dave/temp/myfile.conf", QSettings::IniFormat);
conf.setValue("myMapping", QVariant::fromValue(map));
conf.sync();
}

写入的配置文件:

[General]
myMapping="@Variant(x7fx13QMap<uint,MyClass>x3xc8xc8nnx61mx65x33fvx61lux65x33x65x65nnx61mx65x32fvx61lux65x32x64x64nnx61mx65x31fvx61lux65x31)"

Qt负责序列化/反序列化你的地图 - 不幸的是,这没有考虑到人类的可读性。

您需要手动处理整个映射的序列化/反序列化并写入/读取 QString(或类似的东西(,例如

QString serialize(const QMap<int, MyClass>& mapToSerialize)
{
QStringList result;
for(int key : mapToSerialize.keys())
{
result.append("%1%2%3).arg(QString::number(i), SEPARATOR_TOKEN, serialize(mapToSerialize.value(i));
}
return result.join(MAP_SEPARATOR_TOKEN);
}

这当然有缺点,你 1( 需要为映射和你的类编写序列化/反序列化函数,2( 你需要处理所有特殊情况(转义特殊字符、解析错误数据等(。

相关文章: