c – 向QSettings写入和阅读自定义类

我需要通过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);

保存在注册表中:

QSettings settings("Organization","Application");
QVariant variant;
variant.setValue(QVariant::fromValue<SRSDeFinition>(m_sRSSelected));
settings.setValue("Shared/RecentSRS",variant);

注册表载入:

QSettings settings("Organization","Application");
m_sRSSelected = settings.value("Shared/RecentSRS").value<SRSDeFinition>();

创建注册表中的新键,但它包含十六进制代码,我认为只是类的名称

任何想法如何有效地存储价值?

解决方法

使用qRegisterMetaTypestreamOperators< YourType>(“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;
}

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...