Название: Сохранение и загрузка своей структуры в QSettings, используя варианты
Отправлено: realbustard от Январь 26, 2012, 16:13
Привет всем. Есть идея сохранять свои структуры, в которых нет методов, кроме 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"; }
Название: Re: Сохранение и загрузка своей структуры в QSettings, используя варианты
Отправлено: fuCtor от Январь 26, 2012, 16:35
Думаю стоит посмотреть в сторону перегрузки операторов: C++ (Qt) QDataStream & operator<< ( QDataStream & stream, const MyStruct & pen ) QDataStream & operator>>( QDataStream & stream, MyStruct & pen )
Название: Re: Сохранение и загрузка своей структуры в QSettings, используя варианты
Отправлено: realbustard от Январь 26, 2012, 17:03
Думаю стоит посмотреть в сторону перегрузки операторов: C++ (Qt) QDataStream & operator<< ( QDataStream & stream, const MyStruct & pen ) QDataStream & operator>>( QDataStream & stream, MyStruct & pen )
Сразу туда и смотрел. С потоками все работает, когда файл настроек существует, но, если его нет, структура определяется произвольными значениями, а должна определяться по-умолчанию, заданными в конструкторе значениями.
Название: Re: Сохранение и загрузка своей структуры в QSettings, используя варианты
Отправлено: realbustard от Январь 26, 2012, 17:07
Еще был вариант такой: поместить в QList или QVariantMap объект структуры, не проверял, но должно работать, по идее. Но это неправильно как-то.
|