Сохранение настроек Приложения - это одно из первых действий, которое изучают новички при работе с фреймворком 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
По-прежнему в уроках не вносится изменений профайл проекта.
- #-------------------------------------------------
- #
- # Project created by QtCreator 2015-08-12T09:31:45
- #
- #-------------------------------------------------
- QT += core gui
- greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
- TARGET = Settings
- TEMPLATE = app
- SOURCES += main.cpp\
- mainwindow.cpp
- HEADERS += mainwindow.h
- FORMS += mainwindow.ui
main.cpp
Данный файл подвергается изменениям, поскольку при запуске программы необходимо внести информацию о Приложении в реестр операционной системы.
- #include "mainwindow.h"
- #include <QApplication>
- int main(int argc, char *argv[])
- {
- /* Для адекватной регистрации приложения в операционной
- * необходимо установить название организации, домен организации,
- * а также название приложения.
- * Все настройки будут храниться в операционной системе под этими
- * учетными данными приложения
- * */
- QCoreApplication::setOrganizationName(ORGANIZATION_NAME);
- QCoreApplication::setOrganizationDomain(ORGANIZATION_DOMAIN);
- QCoreApplication::setApplicationName(APPLICATION_NAME);
- QApplication a(argc, argv);
- MainWindow w;
- w.show();
- return a.exec();
- }
mainwindow.h
Помимо методов и объектов, использованных в уроке по QSystemTrayIcon в данный файл необходимо внести Слот для обработки нажатия кнопки, в котором будет производиться сохранение настроек.
Также необходимо подключить в проект заголовочные файлы следующих классов:
- QSettings;
- QMessageBox;
И прописать директивы define, которые будут использоваться при работе с QSettings.
- #ifndef MAINWINDOW_H
- #define MAINWINDOW_H
- #include <QMainWindow>
- #include <QCloseEvent>
- #include <QSystemTrayIcon>
- #include <QAction>
- #include <QSettings>
- #include <QMessageBox>
- /* Defining */
- #define ORGANIZATION_NAME "EVILEG"
- #define ORGANIZATION_DOMAIN "www.evileg.ru"
- #define APPLICATION_NAME "QSettings Program"
- #define SETTINGS_TRAY "settings/tray"
- namespace Ui {
- class MainWindow;
- }
- class MainWindow : public QMainWindow
- {
- Q_OBJECT
- ////////////////// Методы из урока по QSystemTrayIcon
- public:
- explicit MainWindow(QWidget *parent = 0);
- ~MainWindow();
- protected:
- void closeEvent(QCloseEvent * event);
- /////////////////////////////////////////////////////
- private slots:
- void iconActivated(QSystemTrayIcon::ActivationReason reason);
- /* Слот для кнопки, запускающей сохранение настроек приложения
- * */
- void on_saveButton_clicked();
- private:
- Ui::MainWindow * ui;
- QSystemTrayIcon * trayIcon;
- };
- #endif // MAINWINDOW_H
mainwindow.cpp
В данном классе производится выполнение восстановления настроек приложения при инициализации внешнего вида главного окна, а также сохранение настроек по нажатию по кнопке saveButton.
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent),
- ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- this->setWindowTitle(APPLICATION_NAME);
- /* При создании главного окна производим установку начальных параметров
- * из настроек, сохранённых в операционной системе
- * */
- QSettings settings(ORGANIZATION_NAME, APPLICATION_NAME);
- /* Устанавливаем состояние чекбокса из настроек приложения по заданному ключу.
- * Если ключ не существует, то будет установлен параметр по умолчанию,
- * то есть false
- * */
- ui->trayCheckBox->setChecked(settings.value(SETTINGS_TRAY, false).toBool());
- /* Код из урока по работе с QSystemTrayIcon
- * */
- /* *** */
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
- /* Метод из урока по работе с QSystemTraiIcon
- * */
- void MainWindow::closeEvent(QCloseEvent * event)
- {
- /* *** */
- }
- /* Метод из урока по работе с QSystemTraiIcon
- * */
- void MainWindow::iconActivated(QSystemTrayIcon::ActivationReason reason)
- {
- /* *** */
- }
- /* Метод, который принимает сигнал нажатия кнопки
- * и выполняет сохранение настроек приложения
- * */
- void MainWindow::on_saveButton_clicked()
- {
- QSettings settings(ORGANIZATION_NAME, APPLICATION_NAME);
- /* Сохранение информации о включённости функции сворачивания
- * в трей производится в соответствии с состоянием чекбокса.
- * */
- if(ui->trayCheckBox->isChecked()){
- settings.setValue(SETTINGS_TRAY, true);
- } else {
- settings.setValue(SETTINGS_TRAY, false);
- }
- settings.sync();
- /* Диалоговое сообщение, которое сигнализирует об успешности
- * сохранения настроек
- * */
- QMessageBox::information(this,
- trUtf8("Сохранение настроек"),
- trUtf8("Сохранение настроек выполнено успешно"));
- }
Итог по уроку QSettings
Сохранение настроек приложения с QSettings При успешном написании кода из урока, при нажатии кнопки сохранения настроек, настройки сохранятся в реестр операционной системы.
А после перезапуска приложения настройки будут восстановлены. Если при сохранении настроек чекбокс был отмечен, то при запуске приложения он также будет отмечен. И приложение будет вести себя в соответствии с настройками.
Зачем мы добавляли pushButton, если она не используется нигде. Метод on_saveButton_clicked() аналогично нигде не используется и как сигнал не передается?
Вот сразу понятно, что Вы первый день в Qt разработке ))) Ничего плохого не имею ввиду )))
on_saveButton_clicked() - это слот, созданный через Qt Designer, в каких-то статьях я уже это пояснял. Не вижу смысла в каждой статье это объяснять. Такие слоты подключаются при сборке через автоматически генерируемые ui хедеры, поэтому pushButton подключён прямо к этому слоту. Так что всё работает.