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
  • 08 жовтня 2018 р. 10:41

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

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

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

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


Коментарі

Only authorized users can post comments.
Please, Log in or Sign up
e
  • ehot
  • 01 квітня 2024 р. 00:29

C++ - Тест 003. Условия и циклы

  • Результат:78бали,
  • Рейтинг балів2
B
  • Bogdannn
  • 28 березня 2024 р. 05:21

C++ - Тест 002. Константы

  • Результат:16бали,
  • Рейтинг балів-10
B
  • Bogdannn
  • 28 березня 2024 р. 05:15

C++ - Тест 001. Первая программа и типы данных

  • Результат:46бали,
  • Рейтинг балів-6
Останні коментарі
k
kmssr09 лютого 2024 р. 05:43
Qt Linux - Урок 001. Автозапуск програми Qt під Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко05 лютого 2024 р. 12:50
Qt WinAPI - Урок 007. Робота з ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 грудня 2023 р. 21:30
Boost - статичне зв&#39;язування в проекті CMake під Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 грудня 2023 р. 19:38
Boost - статичне зв&#39;язування в проекті CMake під Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik19 грудня 2023 р. 08:01
Qt/C++ - Урок 056. Підключення бібліотеки Boost в Qt для компіляторів MinGW і MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Тепер обговоріть на форумі
a
a_vlasov14 квітня 2024 р. 16:41
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
Павел Дорофеев
Павел Дорофеев14 квітня 2024 р. 12:35
QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
f
fastrex04 квітня 2024 р. 14:47
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
P
Pisych27 лютого 2023 р. 15:04
Как получить в массив значения из связанной модели? Спасибо, разобрался:))
AC
Alexandru Codreanu19 січня 2024 р. 22:57
QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…

Слідкуйте за нами в соціальних мережах