2013-08-09 13 views
9

Potrzebuję przechowywać wystąpienia niestandardowej klasy w Rejestrze za pomocą QSettings. Po przeczytaniu dokumentacji Qt, myślę, że zaimplementowałem potrzebne funkcje, ale nie udało mi się niczego zapisać.Zapisywanie i odczytywanie klasy niestandardowej do QSettings

Oto mój zwyczaj klasa:

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

Zapisywanie w rejestrze:

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

Ładowanie z rejestru:

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

nowy klucz w rejestrze jest tworzony, ale zawiera kod szesnastkowy, który moim zdaniem jest po prostu nazwą klasy ... enter image description here

Każdy pomysł, jak skutecznie przechowywać wartości?

Odpowiedz

15

Użyj qRegisterMetaTypeStreamOperators<YourType>("YourType"), aby umożliwić przekształcanie/odseparowanie typów niestandardowych za pomocą QVariant. Ta funkcja rejestruje funkcje wejścia/wyjścia QDataStream tego typu za pomocą systemu metaterektów Qt, aby mógł wywoływać je podczas zapisywania/ładowania wariantu zawierającego niestandardowy typ.

#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

Rzeczywiście, po prostu przenoszenie 'qRegisterMetaTypeStreamOperators (" SRSDefinition ");' do głównej rozwiązało mój problem. Wielkie dzięki !!! – Ote

Powiązane problemy