Сохранение настроек Приложения - это одно из первых действий, которое изучают новички при работе с фреймворком 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 подключён прямо к этому слоту. Так что всё работает.