Qt. Сохранение/восстановление настроек (Таблица спинбоксов)
Модератор: Модераторы разделов
-
vipermagi
- Сообщения: 83
- ОС: AgiliaLinux
Qt. Сохранение/восстановление настроек
Есть 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.
А ещё более не понятно, как потом, если получится прибавить через конкатенацию индексы, сохранённые настройки востановить обратно.
Как это сделать лучше всего?
Если использовать 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. Сохранение/восстановление настроек
Потому что "..." — это обычные C строки. Можно, например, так:
Только непонятно, зачем делать это для константных строк. А если будут переменные, то проблемы не будет.
Далее, формировать строки с индесками лучше так:
Ну и лично я бы использовал QTableView+самописная модель.
Код: Выделить всё
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. Сохранение/восстановление настроек
потому-что const char[7] невозможно преобразовать в const QString&.
В данном случае создаётся временный объект QString, потому так работает.
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Qt. Сохранение/восстановление настроек
drBatty, const char[7] вполне можно преобразовать в QString. Нельзя именно сложить const char[] + const char[].
-
vipermagi
- Сообщения: 83
- ОС: AgiliaLinux
Re: Qt. Сохранение/восстановление настроек
Что очень забавно. Я когда-то проверял какой тип у "буков в кавычках". В сях это const char*, в плюсах это const string. Во всяком случае ошибки преобразования мне так писали. Кутэшные сообщения ващают об том, что это опять таки const char. Я думал, что в кутях то буквы в кавычках это уже QString, а вон как оказалось.
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Qt. Сохранение/восстановление настроек
И в С, и в 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. Сохранение/восстановление настроек
Сохранение сделать получилось.
Теперь загрузка идёт тем же макаром, потому, как совпадает порядок обхода и в имя можно обратно так же подставить индексы
box->setValue(tableSettings->value(QString("table/col%1_row%2").arg(i).arg(j),0).toDouble());
, но. Появился вопрос: как можно обратно распарсить строку, чтобы вытянуть индексы, если бы строки не совпадали с порядком обхода? Т.е. я щас обхожу вложенным циклом снаружи столбцы внутри строки, а если на загрузке будет наоборот. Это вопрос на будущее, просто внезапно интересно стало.
Теперь загрузка идёт тем же макаром, потому, как совпадает порядок обхода и в имя можно обратно так же подставить индексы
box->setValue(tableSettings->value(QString("table/col%1_row%2").arg(i).arg(j),0).toDouble());
, но. Появился вопрос: как можно обратно распарсить строку, чтобы вытянуть индексы, если бы строки не совпадали с порядком обхода? Т.е. я щас обхожу вложенным циклом снаружи столбцы внутри строки, а если на загрузке будет наоборот. Это вопрос на будущее, просто внезапно интересно стало.
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Qt. Сохранение/восстановление настроек
В принципе, порядок ведь не важен. value() принимает строку и по ней ищет.
Но если интересно как парсить, то тут вопрос немного сложнее. Можно использовать форматное чтение из строки, Си-шные функции:
Вариант 2, распарсить строку регуляркой:
PS код пишу не проверяя, возможны опечатки/баги
Но если интересно как парсить, то тут вопрос немного сложнее. Можно использовать форматное чтение из строки, Си-шные функции:
Код: Выделить всё
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. Сохранение/восстановление настроек
ну никак не в const QString&. Только через промежуточный QString, от которого и брать константную ссылку.
они вам что-то не то писали. "Буковки в кавычках" это именно const char[]. И преобразуются они разве что в const char*. Всё остальное это уже либо грязный хак, либо конструирование временного объекта. Ну например можно и std::string, да.
можно и без QRegExp, оно в glibc тоже есть. См. man 3 regex
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
Re: Qt. Сохранение/восстановление настроек
А, ну это само собой. Я имел в виду, что допустимо неявное преобразование к QString.
Есть. Но раз уже используется Qt, зачем смешивать QString и glibc регулярки? Есть ещё std::regex в C++11.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Qt. Сохранение/восстановление настроек
допустимо, но получится совсем не
а видимо
Код: Выделить всё
const QString &QString::operator+(const QString &);т.е. вообще говоря совсем другой метод, а не дружественная функция, как думалось ТСу. Я это и изначально имел ввиду.
дык const char[] тоже как-то не отсюда (;
-
vipermagi
- Сообщения: 83
- ОС: AgiliaLinux
-
NickLion
- Сообщения: 3408
- Статус: аватар-невидимка
- ОС: openSUSE Tumbleweed x86_64
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: Qt. Сохранение/восстановление настроек
точнее -- не инициализировать.