Qt. Сохранение/восстановление настроек (Таблица спинбоксов)

Модератор: Модераторы разделов

vipermagi
Сообщения: 83
ОС: AgiliaLinux

Qt. Сохранение/восстановление настроек

Сообщение vipermagi »

Есть QTableWidget с QSpinBox'ами в ячейках. Ячеек много(100 например). Нужно сохранить содержимое каждого спинбокса дабы восстановить потом при открытии программы.

Как это сделать лучше всего?

Если использовать QSettings, то не совсем понятно как проставить индексы в цикле
settings->setValue("settings/value1",123);
settings->setValue("settings/value2",456);
.....
Конкатенация
QString a = "jasdf" + "3j3j3j";
почему-то выдаёт ошибку
invalid operands of types 'const char [6]' and 'const char [7]' to binary 'operator+'
хотя в документации написано
const QString operator+ ( const QString & s1, const QString & s2 )
Returns a string which is the result of concatenating s1 and s2.

А ещё более не понятно, как потом, если получится прибавить через конкатенацию индексы, сохранённые настройки востановить обратно.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Qt. Сохранение/восстановление настроек

Сообщение NickLion »

Потому что "..." — это обычные C строки. Можно, например, так:

Код: Выделить всё

QString a = QString("jasdf") + "3j3j3j";

Только непонятно, зачем делать это для константных строк. А если будут переменные, то проблемы не будет.

Далее, формировать строки с индесками лучше так:

Код: Выделить всё

for (int i = 0; i < 100; i++) {
    QString s = QString("settings/value%1").arg(i);
}

Ну и лично я бы использовал QTableView+самописная модель.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Qt. Сохранение/восстановление настроек

Сообщение drBatty »

vipermagi писал(а):
26.11.2013 18:31
invalid operands of types 'const char [6]' and 'const char [7]' to binary 'operator+'
хотя в документации написано
const QString operator+ ( const QString & s1, const QString & s2 )

потому-что const char[7] невозможно преобразовать в const QString&.
NickLion писал(а):
26.11.2013 18:52
QString("jasdf")

В данном случае создаётся временный объект QString, потому так работает.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Qt. Сохранение/восстановление настроек

Сообщение NickLion »

drBatty, const char[7] вполне можно преобразовать в QString. Нельзя именно сложить const char[] + const char[].
Спасибо сказали:
vipermagi
Сообщения: 83
ОС: AgiliaLinux

Re: Qt. Сохранение/восстановление настроек

Сообщение vipermagi »

NickLion писал(а):
26.11.2013 19:16
drBatty, const char[7] вполне можно преобразовать в QString. Нельзя именно сложить const char[] + const char[].


Что очень забавно. Я когда-то проверял какой тип у "буков в кавычках". В сях это const char*, в плюсах это const string. Во всяком случае ошибки преобразования мне так писали. Кутэшные сообщения ващают об том, что это опять таки const char. Я думал, что в кутях то буквы в кавычках это уже QString, а вон как оказалось.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Qt. Сохранение/восстановление настроек

Сообщение NickLion »

И в С, и в C++ "" — это const char* / const char[].

Код: Выделить всё

#include <iostream>
#include <typeinfo>



int main()
{
    std::string s;
    const char* c;
    const char cc[4] = {1,2,3,4};
    std::cout << typeid(s).name() << std::endl;
    std::cout << typeid(c).name() << std::endl;
    std::cout << typeid(cc).name() << std::endl;
    std::cout << typeid("asd").name() << std::endl;
    return 0;
}

g++ b.cpp -o b && ./b

Ss PKc A4_c A4_c

Спасибо сказали:
vipermagi
Сообщения: 83
ОС: AgiliaLinux

Re: Qt. Сохранение/восстановление настроек

Сообщение vipermagi »

Сохранение сделать получилось.

Теперь загрузка идёт тем же макаром, потому, как совпадает порядок обхода и в имя можно обратно так же подставить индексы
box->setValue(tableSettings->value(QString("table/col%1_row%2").arg(i).arg(j),0).toDouble());
, но. Появился вопрос: как можно обратно распарсить строку, чтобы вытянуть индексы, если бы строки не совпадали с порядком обхода? Т.е. я щас обхожу вложенным циклом снаружи столбцы внутри строки, а если на загрузке будет наоборот. Это вопрос на будущее, просто внезапно интересно стало.
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Qt. Сохранение/восстановление настроек

Сообщение NickLion »

В принципе, порядок ведь не важен. value() принимает строку и по ней ищет.

Но если интересно как парсить, то тут вопрос немного сложнее. Можно использовать форматное чтение из строки, Си-шные функции:

Код: Выделить всё

QString ss = ...;
int col, row;
sscanf(ss.toStdString().c_str(), "table/col%d_row%d", &col, &row);

Вариант 2, распарсить строку регуляркой:

Код: Выделить всё

QRegExp re("table/col(\\d+)_row(\\d+)");
if (re.exactMatch(ss)) {
    col = re.cap(1).toInt();
    row = re.cap(2).toInt();
}


PS код пишу не проверяя, возможны опечатки/баги
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Qt. Сохранение/восстановление настроек

Сообщение drBatty »

NickLion писал(а):
26.11.2013 19:16
const char[7] вполне можно преобразовать в QString.

ну никак не в const QString&. Только через промежуточный QString, от которого и брать константную ссылку.
vipermagi писал(а):
26.11.2013 19:39
Что очень забавно. Я когда-то проверял какой тип у "буков в кавычках". В сях это const char*, в плюсах это const string. Во всяком случае ошибки преобразования мне так писали.

они вам что-то не то писали. "Буковки в кавычках" это именно const char[]. И преобразуются они разве что в const char*. Всё остальное это уже либо грязный хак, либо конструирование временного объекта. Ну например можно и std::string, да.
NickLion писал(а):
26.11.2013 20:23
Вариант 2, распарсить строку регуляркой:

можно и без QRegExp, оно в glibc тоже есть. См. man 3 regex
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Qt. Сохранение/восстановление настроек

Сообщение NickLion »

drBatty писал(а):
26.11.2013 20:40
NickLion писал(а):
26.11.2013 19:16
const char[7] вполне можно преобразовать в QString.

ну никак не в const QString&. Только через промежуточный QString, от которого и брать константную ссылку.

А, ну это само собой. Я имел в виду, что допустимо неявное преобразование к QString.

drBatty писал(а):
26.11.2013 20:40
можно и без QRegExp, оно в glibc тоже есть. См. man 3 regex

Есть. Но раз уже используется Qt, зачем смешивать QString и glibc регулярки? Есть ещё std::regex в C++11.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Qt. Сохранение/восстановление настроек

Сообщение drBatty »

NickLion писал(а):
26.11.2013 20:52
Я имел в виду, что допустимо неявное преобразование к QString.

допустимо, но получится совсем не
vipermagi писал(а):
26.11.2013 18:31
const QString operator+ ( const QString & s1, const QString & s2 )

а видимо

Код: Выделить всё

const QString &QString::operator+(const QString &);

т.е. вообще говоря совсем другой метод, а не дружественная функция, как думалось ТСу. Я это и изначально имел ввиду.
NickLion писал(а):
26.11.2013 20:52
Есть. Но раз уже используется Qt, зачем смешивать QString и glibc регулярки?

дык const char[] тоже как-то не отсюда (;
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
vipermagi
Сообщения: 83
ОС: AgiliaLinux

Re: Qt. Сохранение/восстановление настроек

Сообщение vipermagi »

NickLion писал(а):
26.11.2013 20:23
В принципе, порядок ведь не важен. value() принимает строку и по ней ищет.


И вправду. Просто мне спать уже пора давно :)
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Qt. Сохранение/восстановление настроек

Сообщение NickLion »

drBatty писал(а):
26.11.2013 21:09
дык const char[] тоже как-то не отсюда (;

Они неизбежно возникают. По-другому (до C++11, во всяком случае) строки в C++ не объявить.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Qt. Сохранение/восстановление настроек

Сообщение drBatty »

NickLion писал(а):
26.11.2013 21:14
Они неизбежно возникают. По-другому (до C++11, во всяком случае) строки в C++ не объявить.

точнее -- не инициализировать.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали: