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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Как сохранить QList<int> в QSettings?  (Прочитано 8130 раз)
evgeniy
Гость
« : Октябрь 17, 2011, 15:53 »

целиком, не по элементам.
В частности, возможно ли QList<int> преобразовать в Qvariant или QByteArray?
Заранее очень благодарен!
Записан
kibsoft
Хакер
*****
Offline Offline

Сообщений: 625


Просмотр профиля WWW
« Ответ #1 : Октябрь 17, 2011, 16:02 »

Цитировать
QVariant::QVariant ( const QList<QVariant> & val )
int'ы в QVariant хранить

Может как-нибудь так прокатит (не пробовал):
Код:
typedef QList<int> MyList;
Q_DECLARE_METATYPE(MyList)
Записан

http://kibsoft.ru - Download the Qt Media Encoding Library here

The apps that were written using QtMEL:
http://srecorder.com - Screen recording software
Kolobok
Гость
« Ответ #2 : Октябрь 17, 2011, 16:03 »

QVariant QVariant::fromValue ( const T & value ) [static]
Записан
_govorilka
Гость
B
« Ответ #3 : Октябрь 17, 2011, 16:48 »

Посмотри класс QDataStream. Он сохраняет данные в объект класса QIODevice. Через QBuffer можно создать QIODevice из QByteArray,  QByteArray можно сохранить в QSettings.

Для хранения настроек в своём приложении мы используем SQLite, для этого мы написали обёртку над этой библиотекой (http://code.google.com/p/fireworks/). В библиотеке мы начали развивать язык FwML. Это расширение над JSON (www.json.org). Он позволяет записывать массивы чисел в файлы и не только. Возможно, эти наработки будут тебе полезны.
Записан
evgeniy
Гость
« Ответ #4 : Октябрь 17, 2011, 17:49 »

Всем спасибо!
Задача была сохранять пропорции QSplitter.
Похоже оптимальное решение только по элементам.
сохранение:
...
    for (int i = 0; i < spl.sizes().size(); ++i)
            settings->setValue(QString::number(i), spl.sizes().at(i));
...
восстановление:
...
    QList<int> list;
    foreach(QString key, settings->childKeys())
      list.insert(key.toInt(), settings->value(key).toInt());
    spl.setSizes(list);
...
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Октябрь 17, 2011, 18:23 »

А все намного проще... Подмигивающий
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
_govorilka
Гость
« Ответ #6 : Октябрь 18, 2011, 10:58 »


+1

А я про них забыл... Хотя эти функции насколько я помню тоже через QDataStream работают.
Записан
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #7 : Октябрь 18, 2011, 14:15 »

С Пантер согласен. А если например ширину столбцов в таблице, я сделал так:
-сохранение
Код:
QList<QVariant> widthColumns;
for(int numCol = 0; numCol < ui->tableWidget->columnCount(); numCol++)
     widthColumns << ui->tableWidget->columnWidth(numCol);
settings.setValue("/widthColumns", widthColumns);
-восстановление
Код:
QList<QVariant> widthColumns = settings.value("/widthColumns").toList();
for(int numCol = 0; numCol < widthColumns.size(); numCol++)
    ui->tableWidget->setColumnWidth(numCol, widthColumns[numCol].toInt());
Записан

Qt 5.11.0, Win, MinGW
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #8 : Октябрь 18, 2011, 14:22 »

kolob, а я так Улыбающийся
Код
C++ (Qt)
template <class View>
void saveColumnWidthes (QSettings &settings, View *v)
{
settings.beginWriteArray (v->objectName ());
for (int i = 0, count =v->model ()->columnCount (); i < count; ++i) {
settings.setArrayIndex (i);
settings.setValue ("Width", v->columnWidth (i));
}
settings.endArray ();
}
 
template <class View>
void restoreColumnWidthes (QSettings &settings, View *v)
{
const int count = settings.beginReadArray (v->objectName ());
for (int i = 0; i < count; ++i) {
settings.setArrayIndex (i);
v->setColumnWidth (i, settings.value ("Width").toInt ());
}
settings.endArray ();
}
 
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
evgeniy
Гость
« Ответ #9 : Октябрь 18, 2011, 15:02 »

Kolob, Пантер - точно, так правильней.
Но, Пантер, QSplitter::saveState() и прочее не работают.
« Последнее редактирование: Октябрь 18, 2011, 15:12 от evgeniy » Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #10 : Октябрь 18, 2011, 15:23 »

Но, Пантер, QSplitter::saveState() и прочее не работают.
Как делаешь?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
evgeniy
Гость
« Ответ #11 : Октябрь 18, 2011, 15:51 »

QSplitter::saveState() заработал!
Я что-то не так делал.
« Последнее редактирование: Октябрь 18, 2011, 16:08 от evgeniy » Записан
kolob
Частый гость
***
Offline Offline

Сообщений: 296



Просмотр профиля
« Ответ #12 : Ноябрь 13, 2011, 23:57 »

Пантер, а разве индекс колонок начинается не с 0 ?!
Такая запись:
Цитировать
Код:
for (int i = 0, count =v->model ()->columnCount (); i < count; ++i) {
начинает присваевать 1му индексу значение 2й колонки...
Так ведь?! Или я не прав.
Записан

Qt 5.11.0, Win, MinGW
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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