Привет всем.
Есть идея сохранять свои структуры, в которых нет методов, кроме id(), возвращаемого строку с типом структуры. Есть лишь открытые переменные стандартных типов.
Сохранение/загрузка происходит с помощью шаблонных методов load() и save(...).
Ошибка происходит при сохранении в объекте QSettings. При вызове метода load() выскакивают сообщения:
QVariant::save: unable to save type 285.
QVariant::load: unable to load type 285.
QVariant::save: unable to save type 285.
QVariant::load: unable to load type 285.
QVariant::save: unable to save type 285.
Код представлен ниже.
#include <cstddef>
#include <cassert>
#include <QSettings>
#include <QDebug>
#include <QtGlobal>
#include <QtCore/QCoreApplication>
using namespace std;
struct MyStructure
{
MyStructure()
{
frequency = 5465.0;
model = "super_model";
}
MyStructure(double fr, QString m):
frequency(fr),
model(m)
{}
static QString id() { return "my_structure"; }
double frequency;
QString model;
};
Q_DECLARE_METATYPE(MyStructure)
QSettings _settings("/home/alex/myapp.ini", QSettings::IniFormat);
struct SettingsQuery
{
template <class DataT>
static void save2(const DataT &data)
{
_settings.setValue(DataT::id(), qVariantFromValue(data));
}
template <class DataT>
static DataT load2()
{
return qVariantValue<DataT>(_settings.value(DataT::id()));
}
};
void workWithVariants();
int main(int argc, char** argv)
{
// qRegisterMetaType<MyStructure>();
QCoreApplication app(argc, argv);
workWithVariants();
app.exec();
return 0;
}
void workWithVariants()
{
const int id = qRegisterMetaType<MyStructure>();
MyStructure data1, data2;
qDebug() << "Default params of data1";
data1.frequency = 100500;
data1.model = "myModel";
qDebug() << "Set new params:";
// !!!
qDebug() << "Save and load our data structure";
SettingsQuery::save2<MyStructure>(data1);
data2 = SettingsQuery::load2<MyStructure>();
assert(data1.frequency == data2.frequency);
assert(data1.model == data2.model);
assert(data2.frequency == 100500);
qDebug() << "OK";
}