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