Russian Qt Forum

Qt => Вопросы новичков => Тема начата: realbustard от Январь 26, 2012, 16:13



Название: Сохранение и загрузка своей структуры в 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 объект структуры, не проверял, но должно работать, по идее. Но это неправильно как-то.