2013-08-09 7 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>(); 

новый ключ в реестре создается, но он содержит шестнадцатеричный код, который я считаю просто именем класса ... 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

Смежные вопросы