Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将自定义类写入和读取到QSettings_C++_Qt_Serialization_Qsettings - Fatal编程技术网

C++ 将自定义类写入和读取到QSettings

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

我需要通过QSettings在注册表中存储自定义类的实例。在阅读了Qt的文档之后,我认为我已经实现了所需的功能,但是我没有保存任何东西

这是我的自定义类:

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就解决了我的问题。非常感谢!!!