Evgenii Legotckoi
Evgenii Legotckoi13 августа 2015 г. 13: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 При успешном написании кода из урока, при нажатии кнопки сохранения настроек, настройки сохранятся в реестр операционной системы.

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

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

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

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

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

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

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


Комментарии

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

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50баллов,
  • Очки рейтинга-4
m
  • molni99
  • 26 октября 2024 г. 1:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80баллов,
  • Очки рейтинга4
m
  • molni99
  • 26 октября 2024 г. 1:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20баллов,
  • Очки рейтинга-10
Последние комментарии
ИМ
Игорь Максимов22 ноября 2024 г. 11:51
Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi31 октября 2024 г. 14:37
Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 октября 2024 г. 8:19
Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5 октября 2024 г. 7:51
Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55 июля 2024 г. 11:02
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Сейчас обсуждают на форуме
m
moogo22 ноября 2024 г. 7:17
Mosquito Spray System Effective Mosquito Systems for Backyard | Eco-Friendly Misting Control Device & Repellent Spray - Moogo ; Upgrade your backyard with our mosquito-repellent device! Our misters conce…
Evgenii Legotckoi
Evgenii Legotckoi24 июня 2024 г. 15:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 ноября 2024 г. 6:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject4 июня 2022 г. 3:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…

Следите за нами в социальных сетях