2013-08-09 20 views
9

カスタムクラスのインスタンスをQSettings経由でレジストリに格納する必要があります。 Qtのドキュメントを読んだ後、私は必要な機能を実装したと思いますが、何も保存することはできません。QSettingsにカスタムクラスを作成して読み込む

ここに私のカスタムクラスがあります:レジストリ内

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>(); 

レジストリ内の新しいキーが作成されますが、それはクラスの名前だけであると思う16進コードを含んでいます... enter image description here

どのように効果的に値を格納するか?

答えて

15

qRegisterMetaTypeStreamOperators<YourType>("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; 
} 
+0

本当に 'qRegisterMetaTypeStreamOperators (" SRSDefinition ");'をメインの解決済みの問題に移動するだけです。どうもありがとう !!! – Ote

関連する問題