Russian Qt Forum
Ноябрь 24, 2024, 06:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сохранение и загрузка своей структуры в QSettings, используя варианты  (Прочитано 4119 раз)
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";
}
Записан
fuCtor
Гость
« Ответ #1 : Январь 26, 2012, 16:35 »

Думаю стоит посмотреть в сторону перегрузки операторов:
Код
C++ (Qt)
QDataStream & operator<< ( QDataStream & stream, const MyStruct & pen )
QDataStream & operator>>( QDataStream & stream, MyStruct & pen )
 
Записан
realbustard
Гость
« Ответ #2 : Январь 26, 2012, 17:03 »

Думаю стоит посмотреть в сторону перегрузки операторов:
Код
C++ (Qt)
QDataStream & operator<< ( QDataStream & stream, const MyStruct & pen )
QDataStream & operator>>( QDataStream & stream, MyStruct & pen )
 
Сразу туда и смотрел. С потоками все работает, когда файл настроек существует, но, если его нет, структура определяется произвольными значениями, а должна определяться по-умолчанию, заданными в конструкторе значениями.
Записан
realbustard
Гость
« Ответ #3 : Январь 26, 2012, 17:07 »

Еще был вариант такой: поместить в QList или QVariantMap объект структуры, не проверял, но должно работать, по идее. Но это неправильно как-то.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.163 секунд. Запросов: 21.