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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Автоматизация сохранения настроек  (Прочитано 5987 раз)
Student1995
Гость
« : Ноябрь 24, 2013, 00:38 »

Здравствуйте.

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

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

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Ноябрь 24, 2013, 02:58 »

Удобно использовать этот класс: QSettings
Можно и в базе данных хранить QtSql Улыбающийся

Сохранение/загрузка состояния 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
« Последнее редактирование: Ноябрь 24, 2013, 03:00 от gil9red » Записан

ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #2 : Ноябрь 24, 2013, 11:09 »

А где и как в программе хранится это большое число настроек? И как разные части программы получают к ним доступ?
Записан

Пока сам не сделаешь...
Student1995
Гость
« Ответ #3 : Ноябрь 24, 2013, 12:39 »

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

Мне интересно, есть ли способ сохранить настройки с использованием минимума кода. То есть чтобы я НЕ прописывал settings.setValue(<ключ>,<значение>) для каждой настройки, а это происходило как-то автоматически.
Можно ли так сделать? Или только вручную все прописывать?
Записан
Bepec
Гость
« Ответ #4 : Ноябрь 24, 2013, 12:41 »

Тупо возьми функцию и в ней пройдись по lineEdit'ам.
Записан
Student1995
Гость
« Ответ #5 : Ноябрь 24, 2013, 13:09 »

Тупо возьми функцию и в ней пройдись по lineEdit'ам.
А можно небольшой пример кода? Чтобы посмотреть, какой принцип работы будет у функции.
Форма у меня создана в дизайнере.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #6 : Ноябрь 24, 2013, 13:39 »

У QObject есть метод
Цитировать
QList<T> QObject::findChildren ( const QString & name = QString() ) const
С помощью него можно получить список всех эдитов на форме:
Код
C++ (Qt)
QList<QLineEdit *> allEdits = parentWidget.findChildren<QLineEdit *>();
Пройдясь по этому списку, можно в файл сохранять objectName() и text() эдита.

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

Пока сам не сделаешь...
Student1995
Гость
« Ответ #7 : Ноябрь 25, 2013, 01:19 »

Теперь понял. А можно еще узнать, как правильно получить текст lineEdit-а? Прикладываю пример нерабочего пример кода, при его выполнения программа "падает". Что не так, пока что не пойму...

 
Код:
QList<QLineEdit*> allEdits = MainWindow().findChildren<QLineEdit*>();
 for(int i=0; i< (allEdits.size());i++){
        qDebug()<<allEdits[i]->text();
    }
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #8 : Ноябрь 25, 2013, 01:35 »

MainWindow() создает новый временный объект, а тебе нужно обращаться к существующему (как правило this, если вызываешь внутри класса). думаю вывод сделаешь сам.

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

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Student1995
Гость
« Ответ #9 : Ноябрь 25, 2013, 18:10 »

Теперь разобрался. Спасибо всем за помощь Улыбающийся
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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