Написание и чтение пользовательских классов в QSettings

Мне нужно хранить экземпляры пользовательского класса в реестре через 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>();

Создается новый ключ в реестре, но он содержит шестнадцатеричный код, который, я думаю, является просто именем класса …
введите описание изображения здесь

Любая идея, как эффективно хранить значения?

11

Решение

использование 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;
}
18

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]