Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [Qt4]Упаковка в QSettings QList<QString> 
V
    Опции темы
BiTOk
Дата 20.1.2011, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Добрый день. Бьюсь над проблемой: как засунуть в QSettings объект QList<QString>. Почитал в инете, получилось так:
Код

    QList<QString> recentFilesList;

    Q_DECLARE_METATYPE(QList<QString>);

    appSettings = new QSettings("MySoft", "IDE");
    recentFilesList = appSettings->value("recentFiles/files", QVariant(QList<QString>())).value<QList<QString> >();
    recentFilesList.append("Test");
    appSettings->setValue("recentFiles/files", QVariant(recentFilesList));


В итоге получаем файл настроек:
[recentFiles]
files=Test

После повторного запуска recentFilesList пуст, т.е. пустой QList<QString>. Как правильно реализовать задуманное?
PM MAIL   Вверх
borisbn
Дата 20.1.2011, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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





--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
BiTOk
Дата 20.1.2011, 15:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Интересное решение. А можно как-то так, чтобы сразу припаковал весь QList, а потом вытащил его же, не думая о его размере и т.д.?
ADD
Попробовал добавить несколько элементов в QList, в файл настроек они записываются верно, стало быть неверно реализовано чтение.
Код

recentFilesList = appSettings->value("recentFiles/files", QVariant(QList<QString>())).value<QList<QString> >();

т.е. что-то здесь не верно.

Это сообщение отредактировал(а) BiTOk - 20.1.2011, 15:55
PM MAIL   Вверх
borisbn
Дата 20.1.2011, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



В случае со строками и с именами файлов, я бы сделал проще:
Код

// запись:
settings->setValue( "recent", recentFilesList.join( ";" ) );
// чтение
recentFilesList = settings.value( "recent" ).split( ";" );

только recentFilesList должен быть не QList< QString >, а QStringList


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Batbko
Дата 20.1.2011, 23:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



BiTOk, твоя ошибка в том что ты регистрируешь класс в метаобьектной системе только в compile-time, что всего лишь делает доступным использование шаблонной функции QVariant::value() и QVariant::setValue(), а для этого тип элемента с которым будет работать функция надо знать на этапе компиляции.
QSettings же использует рантайм информацию о типе и, не имеет никакого понятия о том как обрабатывать обьекты класса QList<QString>. То что тебе удалось что либо записать для меня пока-что необьяснимо.
Для того что-бы зарегистрировать класс в метаобьектной системе так, чтобы о нём имелась run-time информация необъодимо использовать функцию  qRegisterMetaType(). Для того чтобы можно было (де)серриализовать обьект необходимо определить операторы вида :
QDataStream &operator<<(QDataStream &out, const Регистрируемый_класс &myObj) 
и QDataStream &operator>>(QDataStream &in, Регистрируемый_класс &myObj)
(для класса QList эти операторы уже реализованны разработчиками). Затем надо  вызвать функцию qRegisterMetaTypeStreamOperators(), и тип станет доступен к использованию в любых средствах типа QSettings.

P.S. пример в аттаче.


Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  Qsettings_stringlist.zip 1,72 Kb
PM MAIL   Вверх
panter
Дата 21.1.2011, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пиплы, что-то я вас не пойму. 
QVariant ( const QStringList & val )
Т.е. QStringList отлично сохраняется в QSettings. А что есть QStringList? На крайняк есть QStringList ( const QList<QString> & other )
PM MAIL ICQ Skype Jabber   Вверх
Batbko
Дата 21.1.2011, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ну дык для общего развития smile
PM MAIL   Вверх
BiTOk
Дата 21.1.2011, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



borisbn, спасибо за решение.

Batbko, спасибо за науку, не шарю ещё в метаобъектах.. Буду разбираться.
PM MAIL   Вверх
borisbn
Дата 21.1.2011, 11:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(panter @  21.1.2011,  00:04 Найти цитируемый пост)
На крайняк есть QStringList ( const QList<QString> & other )

такого же простого обратного, к сожалению, нет.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
panter
Дата 21.1.2011, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



borisbn, QList<T> QList::mid ( int pos, int length = -1 ) const разве не оно?
PM MAIL ICQ Skype Jabber   Вверх
borisbn
Дата 21.1.2011, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



panter, это чего-то я протупил. Можно ещё проще:
Код

    QList< QString > recentFilesList;
...    
    QSettings settings;
    // запись:
    settings.setValue( "recent", QStringList( recentFilesList ) );


    // чтение. Тут используется 
    // QList<T> & QList::operator= ( const QList<T> & other )
    // а QStringList, являясь наследником от QList< QString >,
    // легко можно преобразовывать к QList<QString> &
    recentFilesList = settings.value( "recent" ).toStringList();



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

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

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


 




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


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

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