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

Як і раніше, в уроках не вноситься змін профайл проекту.

#-------------------------------------------------
#
# 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 Якщо ви написали код уроку, натиснувши кнопку збереження налаштувань, налаштування зберігатимуться в реєстрі операційної системи.

А після перезапуску програми налаштування буде відновлено. Якщо при збереженні налаштувань чекбокс було відзначено, то при запуску програми він також буде відзначений. І програма буде вести себе відповідно до налаштувань.

Вам це подобається? Поділіться в соціальних мережах!

B
  • 08 жовтня 2018 р. 20:41

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

Evgenii Legotckoi
  • 09 жовтня 2018 р. 13:03

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

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


Коментарі

Only authorized users can post comments.
Please, Log in or Sign up