【问题标题】:Writing and reading custom class to QSettings向 QSettings 编写和读取自定义类
【发布时间】:2013-08-11 05:58:51
【问题描述】:

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

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

知道如何有效地存储这些值吗?

【问题讨论】:

    标签: c++ qt serialization qsettings


    【解决方案1】:

    使用qRegisterMetaTypeStreamOperators&lt;YourType&gt;("YourType") 启用QVariant 自定义类型的序列化/反序列化。此函数将您的类型的 QDataStream 输入/输出函数注册到 Qt 的元类型系统,以便在保存/加载包含您的自定义类型的变体时调用它们。

    #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;
    }
    

    【讨论】:

    • 确实,只需将 qRegisterMetaTypeStreamOperators&lt;SRSDefinition&gt;("SRSDefinition"); 移至 main 即可解决我的问题。非常感谢!!!
    猜你喜欢
    • 1970-01-01
    • 2017-05-20
    • 2021-06-15
    • 1970-01-01
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多