C++ 将自定义类写入和读取到QSettings
我需要通过QSettings在注册表中存储自定义类的实例。在阅读了Qt的文档之后,我认为我已经实现了所需的功能,但是我没有保存任何东西 这是我的自定义类:C++ 将自定义类写入和读取到QSettings,c++,qt,serialization,qsettings,C++,Qt,Serialization,Qsettings,我需要通过QSettings在注册表中存储自定义类的实例。在阅读了Qt的文档之后,我认为我已经实现了所需的功能,但是我没有保存任何东西 这是我的自定义类: class SRSDefinition{ public: SRSDefinition(QString name, QString definition) : qsName(name), qsDefinition(definition) { qRegisterMetaType<SRSDefinition&g
class SRSDefinition{
public:
SRSDefinition(QString name, QString definition) : qsName(name), qsDefinition(definition)
{
qRegisterMetaType<SRSDefinition>("SRSDefinition");
qRegisterMetaTypeStreamOperators<SRSDefinition>("SRSDefinition");
}
SRSDefinition(const SRSDefinition& original) : qsName(original.qsName), qsDefinition(original.qsDefinition) {}
SRSDefinition() : qsName(""), qsDefinition(""){}
~SRSDefinition();
QString qsName;
QString qsDefinition;
private:
friend QDataStream& operator << (QDataStream& out, const SRSDefinition& valeur) {out << valeur.qsName << valeur.qsDefinition; return out; }
friend QDataStream& operator >> (QDataStream& in, SRSDefinition& valeur) {in >> valeur.qsName >> valeur.qsDefinition; return in;}
};
Q_DECLARE_METATYPE(SRSDefinition)
QDataStream& operator << (QDataStream& out, const SRSDefinition& Valeur);
QDataStream& operator >> (QDataStream& in, SRSDefinition& Valeur);
类SRS定义{
公众:
SRS定义(QString名称,QString定义):qsName(名称),qsDefinition(定义)
{
qRegisterMetaType(“SRSDefinition”);
qRegisterMetaTypeStreamOperators(“SRSDefinition”);
}
SRSDefinition(constsrsdefinition&original):qsName(original.qsName),qsDefinition(original.qsDefinition){}
srsdeDefinition():qsName(“”),qsDefinition(“”{}
~SRSDefinition();
QString qsName;
QString定义;
私人:
friend QDataStream&operator>valeur.qsName>>valeur.qsDefinition;返回;}
};
Q_DECLARE_元类型(SRSDefinition)
QDataStream&operator>(QDataStream&in、SRSDefinition&Valeur);
保存在注册表中:
QSettings settings("Organization", "Application");
QVariant variant;
variant.setValue(QVariant::fromValue<SRSDefinition>(m_srsSelected));
settings.setValue("Shared/RecentSRS", variant);
QSettings设置(“组织”、“应用”);
qq变异;
variant.setValue(QVariant::fromValue(m_srsSelected));
设置值(“共享/最近SRS”,变量);
从注册表加载:
QSettings settings("Organization", "Application");
m_srsSelected = settings.value("Shared/RecentSRS").value<SRSDefinition>();
QSettings设置(“组织”、“应用”);
m_srsSelected=设置.value(“共享/最近srs”).value();
注册表中创建了一个新键,但它包含十六进制代码,我认为这只是类的名称。。。
知道如何有效地存储值吗?使用
qRegisterMetaTypeStreamOperators(“YourType”)
启用QVariant自定义类型的序列化/反序列化。此函数向Qt的元类型系统注册类型的QDataStream输入/输出函数,以便在保存/加载包含自定义类型的变量时调用它们
#include <QtCore/QDebug>
#include <QtCore/QDataStream>
#include <QtCore/QSettings>
struct CustomType {
QString name;
int age;
};
Q_DECLARE_METATYPE(CustomType);
QDataStream& operator<<(QDataStream& out, const CustomType& v) {
out << v.name << v.age;
return out;
}
QDataStream& operator>>(QDataStream& in, CustomType& v) {
in >> v.name;
in >> v.age;
return in;
}
int main(int,char**) {
qRegisterMetaTypeStreamOperators<CustomType>("CustomType");
{
CustomType t;
t.name = "John Smith";
t.age = 42;
QSettings s("config.ini", QSettings::IniFormat);
s.setValue("user", QVariant::fromValue(t));
}
{
QSettings s("config.ini", QSettings::IniFormat);
QVariant value = s.value("user");
CustomType t = value.value<CustomType>();
qDebug() << t.name << t.age;
}
return 0;
}
#包括
#包括
#包括
结构自定义类型{
QString名称;
智力年龄;
};
Q_DECLARE_元类型(CustomType);
QDataStream&运营商v.name;
在>>年代;
返回;
}
int main(int,char**){
qRegisterMetaTypeStreamOperators(“CustomType”);
{
t型;
t、 name=“约翰·史密斯”;
t、 年龄=42岁;
QSettings(“config.ini”,QSettings::ini格式);
s、 setValue(“用户”,QVariant::fromValue(t));
}
{
QSettings(“config.ini”,QSettings::ini格式);
QVariant value=s.value(“用户”);
CustomType t=value.value();
qDebug()事实上,只要将qRegisterMetaTypeStreamOperators(“SRSDefinition”);
移动到main就解决了我的问题。非常感谢!!!