Russian Qt Forum

Qt => Общие вопросы => Тема начата: Student1995 от Ноябрь 24, 2013, 00:38



Название: Автоматизация сохранения настроек
Отправлено: Student1995 от Ноябрь 24, 2013, 00:38
Здравствуйте.

При работе над проектом возникла задача сохранения большого числа настроек.

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


Название: Re: Автоматизация сохранения настроек
Отправлено: gil9red от Ноябрь 24, 2013, 02:58
Удобно использовать этот класс: QSettings (http://qt-project.org/doc/qt-4.8/qsettings.html#details)
Можно и в базе данных хранить QtSql (http://doc.crossplatform.ru/qt/4.5.0/qtsql.html) :)

Сохранение/загрузка состояния toolbars и dockwidgets (используется в QMainWindow):
http://qt-project.org/doc/qt-4.8/qmainwindow.html#saveState
http://qt-project.org/doc/qt-4.8/qmainwindow.html#restoreState

Сохранение/загрузка положения на экране и размера:
http://qt-project.org/doc/qt-4.8/qwidget.html#saveGeometry
http://qt-project.org/doc/qt-4.8/qwidget.html#restoreGeometry


Название: Re: Автоматизация сохранения настроек
Отправлено: ViTech от Ноябрь 24, 2013, 11:09
А где и как в программе хранится это большое число настроек? И как разные части программы получают к ним доступ?


Название: Re: Автоматизация сохранения настроек
Отправлено: Student1995 от Ноябрь 24, 2013, 12:39
А где и как в программе хранится это большое число настроек? И как разные части программы получают к ним доступ?
Настройки у меня должны записываться в ini файл в форме ключ-значение. В основном, значения будут браться из QLineEdit-ов.

Мне интересно, есть ли способ сохранить настройки с использованием минимума кода. То есть чтобы я НЕ прописывал settings.setValue(<ключ>,<значение>) для каждой настройки, а это происходило как-то автоматически.
Можно ли так сделать? Или только вручную все прописывать?


Название: Re: Автоматизация сохранения настроек
Отправлено: Bepec от Ноябрь 24, 2013, 12:41
Тупо возьми функцию и в ней пройдись по lineEdit'ам.


Название: Re: Автоматизация сохранения настроек
Отправлено: Student1995 от Ноябрь 24, 2013, 13:09
Тупо возьми функцию и в ней пройдись по lineEdit'ам.
А можно небольшой пример кода? Чтобы посмотреть, какой принцип работы будет у функции.
Форма у меня создана в дизайнере.


Название: Re: Автоматизация сохранения настроек
Отправлено: ViTech от Ноябрь 24, 2013, 13:39
У QObject есть метод
Цитировать
QList<T> QObject::findChildren (http://qt-project.org/doc/qt-4.8/qobject.html#findChildren) ( const QString & name = QString() ) const
С помощью него можно получить список всех эдитов на форме:
Код
C++ (Qt)
QList<QLineEdit *> allEdits = parentWidget.findChildren<QLineEdit *>();
Пройдясь по этому списку, можно в файл сохранять objectName() и text() эдита.

Только туда могут попасть эдиты, которые не надо сохранять. Потом еще потребуется сохранять QComboBox, QRadioButton и пр. В общем, хранить настройки в виджетах формы не самая лучшая идея :). Хотя в начале многие пытаются так делать. Настройки, как правило, являются свойствами какого-то объекта, оттуда их и надо брать. Или воспользоваться QSettings, как глобальным объектом для настроек.


Название: Re: Автоматизация сохранения настроек
Отправлено: Student1995 от Ноябрь 25, 2013, 01:19
Теперь понял. А можно еще узнать, как правильно получить текст lineEdit-а? Прикладываю пример нерабочего пример кода, при его выполнения программа "падает". Что не так, пока что не пойму...

 
Код:
QList<QLineEdit*> allEdits = MainWindow().findChildren<QLineEdit*>();
 for(int i=0; i< (allEdits.size());i++){
        qDebug()<<allEdits[i]->text();
    }


Название: Re: Автоматизация сохранения настроек
Отправлено: kambala от Ноябрь 25, 2013, 01:35
MainWindow() создает новый временный объект, а тебе нужно обращаться к существующему (как правило this, если вызываешь внутри класса). думаю вывод сделаешь сам.

пробегаться по контейнерам проще через Qt-шный foreach или C++11-ый for each.


Название: Re: Автоматизация сохранения настроек
Отправлено: Student1995 от Ноябрь 25, 2013, 18:10
Теперь разобрался. Спасибо всем за помощь :)