Области видимости
Хочется создать в qt приложении класс settingsApp, который бы после загрузки приложения брал через QSettings(из реестра виндоус) в себя различные настройки и хранил их, передавал в различные функции, если надо. Но можно использовать наверное и просто QSettings. Но вопрос в том, где и как их создавать(экземпляры класса QSettings или settingsApp) чтобы они были доступны из всех мест программы? У меня в программе несколько отдельных виджетов.
#ifndef SETTINGS_H #define SETTINGS_H #include <Headers/ModBusUSB.h> #include <QSettings> class settingsClass { public: TConfigUSBPort configUSBDevice; int tresHold; settingsClass() {} }; void readSettings(settingsClass &settingsDiesel); #endif // SETTINGS_H
#include <Headers/settings.h> settingsClass settingsDiesel; void readSettings(settingsClass &settingsDiesel){ QSettings *settings; settings = new QSettings; settingsDiesel.configUSBDevice.adc_count = settings->value("count").toInt(); settingsDiesel.configUSBDevice.adc_freq = settings->value("freq").toInt(); settingsDiesel.configUSBDevice.pid = settings->value("PID").toInt(); settingsDiesel.configUSBDevice.vid = settings->value("VID").toInt(); settingsDiesel.configUSBDevice.timeOut = settings->value("timeout").toInt(); settingsDiesel.tresHold = settings->value("treshold").toInt(); }Вот settings.h и .cpp, но объект settingsDiesel не доступен в widgetSettings Заголовок settings.h подключен в widgetSettings.h
#include <Headers/widgetsettings.h> #include "ui_widgetsettings.h" widgetSettings::widgetSettings(QWidget *parent) : QWidget(parent), ui(new Ui::widgetSettings) { ui->setupUi(this); QRegExp pid("[1-9]\\d{0,3}"); QValidator *validatorPID = new QRegExpValidator(pid, this); ui->lineEditPID->setValidator(validatorPID); ui->lineEditVID->setValidator(validatorPID); ui->spinBoxCount->setMaximum(MAX_COUNT_ADC); } widgetSettings::~widgetSettings() { delete ui; } void widgetSettings::on_pushButtonAccept_clicked() { QSettings settings(ORGANIZATION_NAME, APPLICATION_NAME); bool ok; auto PID = QString("0x" + ui->lineEditPID->text()).toInt(&ok, 16); auto VID = QString("0x" + ui->lineEditVID->text()).toInt(&ok, 16); settings.setValue("PID", PID); settings.setValue("VID", VID); settings.setValue("timeout", ui->spinBoxTimeout->value()); settings.setValue("freq", ui->spinBoxFreq->value()); settings.setValue("count", ui->spinBoxCount->value()); settings.setValue("treshold",ui->spinBoxTreshold->value()); settings.sync(); }
2
94
Вам это нравится? Поделитесь в социальных сетях!
Комментарии
Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Пожалуйста, авторизуйтесь или зарегистрируйтесь
- Последние комментарии
- AK1 апреля 2025 г. 11:41Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
- VP9 марта 2025 г. 16:14Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
- ИМ22 ноября 2024 г. 21:51Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
- Сейчас обсуждают на форуме
- МА1 апреля 2025 г. 16:210ff763fe-4e50-455d-a3a6-5699c243b1a5_17_44_22_1.xml
- f15 февраля 2025 г. 13:46Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
- Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
- Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
Итак. Первое, что стоит учитывать, это то, что если в функции main прописать следующее:
то тогда не нужно будет каждый раз писать так
Достаточно будет записи
Следующий момент, который следует учитывать, так это то, что QSettings можно дергать в любом месте проекта и сразу получать значения, ну это вы и так знаете. Для получения одиночных значений можно использовать сразу QSettings.
Но если имеется необходимость всё вывести в единый класс, который отвечал бы за настройки, то возможно имеет смысл использовать статические методы и даже... может быть синглтон.
Тогда сохранение настроек в диалоге настроек может выглядеть так:
А сами эти методы могут выглядеть так:
Заголовочный файл: Файл реализации:Таким образом с помощью статических методов можно будет дергать параметры в любом месте программы и когда захочется. Достаточно будет добавить в нужном файле заголовочный файл stylehelper.h и воспользоваться статическими методами для получения необходимых настроек.
То есть для каждого значения(переменной), которое я хочу сохранить, надо реализовать статик-методы get и set? Я правильно понял? В синглтон пока рано лезть, хотя я тоже про него думал (прочитал в одной книжке и подумал, что это то, что мне надо).
У QSettings оказывается тоже есть статик-методы
. Может можно просто их использоватьКонечно, можно и эти методы использовать. Вообще, всё зависит от задачи. Если нужно дёрнуть одно значение, то можно и статическими методами QSettings воспользоваться. Если нужно брать пачку значений для какого-то специального объекта, то можно сделать обёртку с методом, который будет принимать в качестве аргумента ссылку или указатель на данный объект и добавлять в него все необходимые объекты.
Решил все таки сделать синглтон, я только не очень понимаю, где именно его создать, чтобы был доступ по всей программе?
Тут надо понимать, что такое Singleton (одиночка). Под синглтоном подразумевается класс, который имеет в программе только один экземпляр, который создаётся при первом обращении к нему, применительно к C++. Раз экземпляр в программе только один, значит объект в данном случае должен объявляться как static и обращение к нему должно быть сделано через статический метод. Например, можно использовать Синглтон Меерса
В данном случае получение экземпляра класса всегда должно осуществляться через статический метод SingletonClass::instance() Все остальные методы могут быть не статическими. А применять его можно будет абсолютно везде, где будет подключён его заголовочный файл.
Только нужно поосторожнее работать с этим паттерном проектирования, поскольку иногда от него могут быть только проблемы. Особенно, если в какой-то момент понадобится иметь два и более экземпляров этого класса. Например, для нескольких настроек софта, которые могут быть применены для разных открытых документов. Перекраивать в таком случае крупный проект будет весьма затратно.
Я вроде все понял. Спасибо большое.