2013-08-09 9 views
9

È necessario memorizzare le istanze di una classe personalizzata nel registro tramite QSettings. Dopo aver letto dalla documentazione di Qt, penso di aver implementato le funzioni necessarie ma non riesco a salvare nulla.Scrittura e lettura di classi personalizzate su QSettings

Ecco la mia classe personalizzata:

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

risparmio nel Registro di sistema:

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

Caricamento dal Registro di sistema:

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

Una nuova chiave di registro viene creata, ma contiene codice esadecimale che penso sia solo il nome della classe ... enter image description here

Qualche idea su come memorizzare in modo efficace i valori?

risposta

15

Utilizzare qRegisterMetaTypeStreamOperators<YourType>("YourType") per abilitare la serializzazione/deserializzazione di tipi personalizzati con QVariant. Questa funzione registra le funzioni di input/output QDataStream del tuo tipo con il sistema metatype di Qt in modo che possa richiamarle quando salva/carica una variante contenente il tuo tipo personalizzato.

#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

Infatti, semplicemente spostando 'qRegisterMetaTypeStreamOperators ("SRSDefinition");' alla principale risolto il mio problema. Molte grazie !!! – Ote