Evgenii Legotckoi
13 августа 2015 г. 23:29

Qt/C++ - Урок 003. QSettings или Как сохранить настройки приложения?

Сохранение настроек Приложения - это одно из первых действий, которое изучают новички при работе с фреймворком Qt. Для этого используется класс QSettings, который позволяет сохранять настройки либо в реестр операционной системы, либо в текстовый файл. В данном уроке будет использован самый простой вариант - это сохранение настроек в реестр операционной системы. Для обеспечения наглядности работы сохранения настроек в данном уроке использовался проект из урока по QSystemTrayIcon .

Программный код был написан в QtCreator 3.3.1 на основе Qt 5.4.1 под Windows.

Структура проекта

Проект создается как Приложение Qt Widgets, в котором по умолчанию создаются файлы:

  • Settings.pro - профайл;
  • mainwindow.h - заголовочный файл основного окна приложения;
  • mainwindow.cpp - исходный код окна;
  • main.cpp - основной исходный файл, с которого стартует приложение;
  • mainwindow.ui - формочка основного окна приложения.

Примечание. Большую часть интерфейса создаю в дизайнере, чтобы не загромождать логику основного кода лишней информацией. По сути это лишь дело вкуса и привычки.

mainwindow.ui

Формочка для QSettings Program Создаем формочку для теста, в которой будут использоваться два следующих объекта:

  • trayCheckBox - чекбокс для настройки поведения приложения;
  • saveButton - кнопка для выполнения сохранения настроек Приложения;

Settings.pro

По-прежнему в уроках не вносится изменений профайл проекта.

  1. #-------------------------------------------------
  2. #
  3. # Project created by QtCreator 2015-08-12T09:31:45
  4. #
  5. #-------------------------------------------------
  6.  
  7. QT += core gui
  8.  
  9. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
  10.  
  11. TARGET = Settings
  12. TEMPLATE = app
  13.  
  14.  
  15. SOURCES += main.cpp\
  16. mainwindow.cpp
  17.  
  18. HEADERS += mainwindow.h
  19.  
  20. FORMS += mainwindow.ui

main.cpp

Данный файл подвергается изменениям, поскольку при запуске программы необходимо внести информацию о Приложении в реестр операционной системы.

  1. #include "mainwindow.h"
  2. #include <QApplication>
  3.  
  4. int main(int argc, char *argv[])
  5. {
  6. /* Для адекватной регистрации приложения в операционной
  7. * необходимо установить название организации, домен организации,
  8. * а также название приложения.
  9. * Все настройки будут храниться в операционной системе под этими
  10. * учетными данными приложения
  11. * */
  12. QCoreApplication::setOrganizationName(ORGANIZATION_NAME);
  13. QCoreApplication::setOrganizationDomain(ORGANIZATION_DOMAIN);
  14. QCoreApplication::setApplicationName(APPLICATION_NAME);
  15.  
  16. QApplication a(argc, argv);
  17. MainWindow w;
  18. w.show();
  19.  
  20. return a.exec();
  21. }

mainwindow.h

Помимо методов и объектов, использованных в уроке по QSystemTrayIcon в данный файл необходимо внести Слот для обработки нажатия кнопки, в котором будет производиться сохранение настроек.

Также необходимо подключить в проект заголовочные файлы следующих классов:

  • QSettings;
  • QMessageBox;

И прописать директивы define, которые будут использоваться при работе с QSettings.

  1. #ifndef MAINWINDOW_H
  2. #define MAINWINDOW_H
  3.  
  4. #include <QMainWindow>
  5. #include <QCloseEvent>
  6. #include <QSystemTrayIcon>
  7. #include <QAction>
  8. #include <QSettings>
  9. #include <QMessageBox>
  10.  
  11. /* Defining */
  12. #define ORGANIZATION_NAME "EVILEG"
  13. #define ORGANIZATION_DOMAIN "www.evileg.ru"
  14. #define APPLICATION_NAME "QSettings Program"
  15.  
  16. #define SETTINGS_TRAY "settings/tray"
  17.  
  18. namespace Ui {
  19. class MainWindow;
  20. }
  21.  
  22. class MainWindow : public QMainWindow
  23. {
  24. Q_OBJECT
  25.  
  26. ////////////////// Методы из урока по QSystemTrayIcon
  27. public:
  28. explicit MainWindow(QWidget *parent = 0);
  29. ~MainWindow();
  30.  
  31. protected:
  32. void closeEvent(QCloseEvent * event);
  33. /////////////////////////////////////////////////////
  34.  
  35. private slots:
  36. void iconActivated(QSystemTrayIcon::ActivationReason reason);
  37.  
  38. /* Слот для кнопки, запускающей сохранение настроек приложения
  39. * */
  40. void on_saveButton_clicked();
  41.  
  42. private:
  43. Ui::MainWindow * ui;
  44. QSystemTrayIcon * trayIcon;
  45. };
  46.  
  47. #endif // MAINWINDOW_H

mainwindow.cpp

В данном классе производится выполнение восстановления настроек приложения при инициализации внешнего вида главного окна, а также сохранение настроек по нажатию по кнопке saveButton.

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3.  
  4. MainWindow::MainWindow(QWidget *parent) :
  5. QMainWindow(parent),
  6. ui(new Ui::MainWindow)
  7. {
  8. ui->setupUi(this);
  9. this->setWindowTitle(APPLICATION_NAME);
  10.  
  11.  
  12. /* При создании главного окна производим установку начальных параметров
  13. * из настроек, сохранённых в операционной системе
  14. * */
  15. QSettings settings(ORGANIZATION_NAME, APPLICATION_NAME);
  16. /* Устанавливаем состояние чекбокса из настроек приложения по заданному ключу.
  17. * Если ключ не существует, то будет установлен параметр по умолчанию,
  18. * то есть false
  19. * */
  20. ui->trayCheckBox->setChecked(settings.value(SETTINGS_TRAY, false).toBool());
  21.  
  22. /* Код из урока по работе с QSystemTrayIcon
  23. * */
  24.  
  25. /* *** */
  26. }
  27.  
  28. MainWindow::~MainWindow()
  29. {
  30. delete ui;
  31. }
  32.  
  33. /* Метод из урока по работе с QSystemTraiIcon
  34. * */
  35. void MainWindow::closeEvent(QCloseEvent * event)
  36. {
  37. /* *** */
  38. }
  39.  
  40. /* Метод из урока по работе с QSystemTraiIcon
  41. * */
  42. void MainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason)
  43. {
  44. /* *** */
  45. }
  46.  
  47. /* Метод, который принимает сигнал нажатия кнопки
  48. * и выполняет сохранение настроек приложения
  49. * */
  50. void MainWindow::on_saveButton_clicked()
  51. {
  52. QSettings settings(ORGANIZATION_NAME, APPLICATION_NAME);
  53. /* Сохранение информации о включённости функции сворачивания
  54. * в трей производится в соответствии с состоянием чекбокса.
  55. * */
  56. if(ui->trayCheckBox->isChecked()){
  57. settings.setValue(SETTINGS_TRAY, true);
  58. } else {
  59. settings.setValue(SETTINGS_TRAY, false);
  60. }
  61. settings.sync();
  62.  
  63. /* Диалоговое сообщение, которое сигнализирует об успешности
  64. * сохранения настроек
  65. * */
  66. QMessageBox::information(this,
  67. trUtf8("Сохранение настроек"),
  68. trUtf8("Сохранение настроек выполнено успешно"));
  69. }

Итог по уроку QSettings

Сохранение настроек приложения с QSettings При успешном написании кода из урока, при нажатии кнопки сохранения настроек, настройки сохранятся в реестр операционной системы.

А после перезапуска приложения настройки будут восстановлены. Если при сохранении настроек чекбокс был отмечен, то при запуске приложения он также будет отмечен. И приложение будет вести себя в соответствии с настройками.

Вам это нравится? Поделитесь в социальных сетях!

B
  • 8 октября 2018 г. 20:41

Зачем мы добавляли pushButton, если она не используется нигде. Метод on_saveButton_clicked() аналогично нигде не используется и как сигнал не передается?

Evgenii Legotckoi
  • 9 октября 2018 г. 13:03

Вот сразу понятно, что Вы первый день в Qt разработке ))) Ничего плохого не имею ввиду )))

on_saveButton_clicked() - это слот, созданный через Qt Designer, в каких-то статьях я уже это пояснял. Не вижу смысла в каждой статье это объяснять. Такие слоты подключаются при сборке через автоматически генерируемые ui хедеры, поэтому pushButton подключён прямо к этому слоту. Так что всё работает.


Комментарии

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