Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранение настроек QSettings, не могу сохранить свои собственные типы 
:(
    Опции темы
Dark2011
Дата 29.7.2014, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 15.11.2012

Репутация: нет
Всего: нет



В общем есть вот такая вот банальная структурка

struct SaveInfo 
{
public:
    SaveInfo () : m_sensorName( QString() ), m_sensorType( QString() ), m_groupType( QString() ),
                   m_type( QString() ), m_mdk( QString() ) { ; }

    SaveInfo (QString sensor, QString group, QString type, QString mdk) :
    m_sensorType(sensor), m_groupType(group), m_type(type), m_mdk(mdk) { ; }


    QString m_sensorName;
    QString m_sensorType;
    QString m_groupType;
    QString m_type;
    QString m_mdk;
};
Q_DECLARE_METATYPE(SaveInfo);

я ее сразу декларирую чтоб можно было юзать с QVariant

Далее есть главный класс многооконного приложения в котором есть список настроек от разных окон


class SmMainWidget : public QMainWindow
{
    .....

public slots:
    void addSaveInfo(const SaveInfo &);

private:
    .......
    .......
    void saveSettings();

private:
    QVariantList m_settings;

};

в методе addSaveInfo я добавляю / обновляю настройки

/*slot*/void SmMainWindow::addSaveInfo(const SaveInfo &info)
{
    int number = info.m_sensorName.right(1).toInt() - 1; //Position of sensor's settings in settings list;
    
    QVariant saveVarObj;
    saveVarObj.setValue<SaveInfo>(info);


    if( ( m_settings.isEmpty() ) || (m_settings.size() <= number) )
        m_settings.append(saveVarObj);
    else m_settings[number] = saveVarObj;
}

Ну и собственно в деструкторе происходит вызов  saveSettings()

void SmMainWindow::saveSettings()
{
    QSettings settings("Test", "MDKWidgets");
    
    settings.beginGroup("Target widgets settings");
    settings.setValue("MDK settings", m_settings);
    settings.endGroup();
}
Если список пустой  - то ОК, а если есть настройки - то
вываливается Assert failure in QVariant::save: "Invalid type to save"

Сделал простейший тест - вместо QVariantList использовал просто QVariant сконвертированный под эту структуру - таже фигня

void testSave()
{
     SaveInfo test1;
     QVariant testSettings;
     testSettings.setValue(test1);

     QSettings settings("Test", "MDKWidgets");
     settings.beginGroup("MDK widgets settings");
     settings.setValue("test_settings", testSettings);
     settings.endGroup();
}

еще пробовал непосредственно перед использованием 
 settings.setValue("test_settings", testSettings);
сделать вот так qRegisterMetaType<SaveInfo>("SaveInfo"); (хотя помойму после макроса Q_DECLARE_METATYPE(SaveInfo)  это необязательно);


Или QSettings не может работать с такими Вариантами даже если они задекларированы ???

Спасибо!





Это сообщение отредактировал(а) Dark2011 - 29.7.2014, 15:08
PM MAIL   Вверх
Dark2011
Дата 29.7.2014, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 15.11.2012

Репутация: нет
Всего: нет



Все решение найдено))

В общем при использование своих типов с QSettings необходимо:

1) Задекларировать свой тип данных сразу после объявления:

class YourObject
{
public:
    YourObject(){.....;}

private:
    ....
};
 Q_DECLARE_METATYPE(YourObject);

2) Определить операторы ввода вывода

QDataStream & operator<< (QDataStream &out, const YourObject &obj)
{
    .......
    return out;
}
QDataStream& operator>> (QDataStream &in, YourObject &obj )
{
    .......
    return in;
}

соответственно объявив их как друзья класса

 class YourObject
{
public:
    YourObject(){.....;}

    friend QDataStream & operator<< (QDataStream &, const YourObject &);
    friend QDataStream& operator>> (QDataStream &, YourObject &);

private:
    ....
};

3) непосредственно перед использованием вызвать:
    qRegisterMetaType<YourObject>("YourObject");
    qRegisterMetaTypeStreamOperators<YourObject>("YourObject");

    Например:

    void SmMainWindow::saveSettings()
    {
    QSettings settings("Test", "TESTSettings");
    
    qRegisterMetaType<YourObject>("YourObject");
    qRegisterMetaTypeStreamOperators<YourObject>("YourObject");
   

        YourObject testSaveObject;
        QVariant saveVar;
        saveVar.setValue<YourObject>(testSaveObject);


    settings.beginGroup("YourObject Group");
    settings.setValue("testSave", saveVar);  
    settings.endGroup();
    }
   
   
void SmMainWindow::loadSettings()
{
    QSettings settings("Test", "TESTSettings");

    settings.beginGroup("YourObject Group");
    qRegisterMetaType<YourObject>("YourObject");
    qRegisterMetaTypeStreamOperators<YourObject>("YourObject");
        QVariant loadVar = settings.value("testSave");
    settings.endGroup();
 
        YourObject testSaveObject = loadVar.value<YourObject>();
}


   
PM MAIL   Вверх
math64
Дата 29.7.2014, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 23
Всего: 72



Регистрироваться нужно один раз, перед первым использованием.
Операторы ввода/вывода объявлять друзьями не обязательно.
PM   Вверх
bsa
Дата 29.7.2014, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 24
Всего: 196



Цитата(math64 @  29.7.2014,  17:48 Найти цитируемый пост)
Регистрироваться нужно один раз, перед первым использованием.

Самый простой способ это сделать - в main().
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0433 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.