Russian Qt Forum

Qt => Общие вопросы => Тема начата: evgeniy от Октябрь 17, 2011, 15:53



Название: Как сохранить QList<int> в QSettings?
Отправлено: evgeniy от Октябрь 17, 2011, 15:53
целиком, не по элементам.
В частности, возможно ли QList<int> преобразовать в Qvariant или QByteArray?
Заранее очень благодарен!


Название: Re: Как сохранить QList<int> в QSettings?
Отправлено: kibsoft от Октябрь 17, 2011, 16:02
Цитировать
QVariant::QVariant ( const QList<QVariant> & val )
int'ы в QVariant хранить

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


Название: Re: Как сохранить QList<int> в QSettings?
Отправлено: Kolobok от Октябрь 17, 2011, 16:03
QVariant QVariant::fromValue ( const T & value ) [static]


Название: B
Отправлено: _govorilka от Октябрь 17, 2011, 16:48
Посмотри класс QDataStream. Он сохраняет данные в объект класса QIODevice. Через QBuffer можно создать QIODevice из QByteArray,  QByteArray можно сохранить в QSettings.

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


Название: Re: Как сохранить QList<int> в QSettings?
Отправлено: evgeniy от Октябрь 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);
...


Название: Re: Как сохранить QList<int> в QSettings?
Отправлено: Пантер от Октябрь 17, 2011, 18:23
А все намного проще... (http://doc.qt.nokia.com/4.7/qsplitter.html#saveState) ;)


Название: Re: Как сохранить QList<int> в QSettings?
Отправлено: _govorilka от Октябрь 18, 2011, 10:58
А все намного проще... (http://doc.qt.nokia.com/4.7/qsplitter.html#saveState) ;)

+1

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


Название: Re: Как сохранить QList<int> в QSettings?
Отправлено: kolob от Октябрь 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());


Название: Re: Как сохранить QList<int> в QSettings?
Отправлено: Пантер от Октябрь 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 ();
}
 


Название: Re: Как сохранить QList<int> в QSettings?
Отправлено: evgeniy от Октябрь 18, 2011, 15:02
Kolob, Пантер - точно, так правильней.
Но, Пантер, QSplitter::saveState() и прочее не работают.


Название: Re: Как сохранить QList<int> в QSettings?
Отправлено: Пантер от Октябрь 18, 2011, 15:23
Но, Пантер, QSplitter::saveState() и прочее не работают.
Как делаешь?


Название: Re: Как сохранить QList<int> в QSettings?
Отправлено: evgeniy от Октябрь 18, 2011, 15:51
QSplitter::saveState() заработал!
Я что-то не так делал.


Название: Re: Как сохранить QList<int> в QSettings?
Отправлено: kolob от Ноябрь 13, 2011, 23:57
Пантер, а разве индекс колонок начинается не с 0 ?!
Такая запись:
Цитировать
Код:
for (int i = 0, count =v->model ()->columnCount (); i < count; ++i) {
начинает присваевать 1му индексу значение 2й колонки...
Так ведь?! Или я не прав.