У меня есть два QSettings в разных файлах, у одного все значения передаются в реестр, а другого - нет
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QSettings>
#include "counter2.h"
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = nullptr);
~MainWindow();
private:
Ui::MainWindow* ui;
counter2* counter_2;
counter2* counter_3;
QSettings* settings;
public:
void save();
void load();
private slots:
//Diclaration slots'
void cleanLines();
void cleanAmounters();
void cleanAll();
void toggleCounter3();
void toggleCounter4();
void toggleCounter5();
void toggleCounter6();
void toggleWindow2();
void toggleWindow3();
};
#endif // MAINWINDOW_H
mainwindow.cpp: //здесь всё ок
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "counter2.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
counter_2 = new counter2();
counter_3 = new counter2();
settings = new QSettings("SimpleStudio", "Counter1", this);
//Diclaration variables & QObject::connect
connect(counter_2, &counter2::toggleToCounter1,
this, &MainWindow::show);
connect(counter_3, &counter2::toggleToCounter1,
this, &MainWindow::show);
connect(counter_3, &counter2::toggleToCounter2,
this, &MainWindow::toggleWindow2);
connect(counter_2, &counter2::toggleToCounter3,
this, &MainWindow::toggleWindow3);
QObject::connect(ui->toggleButton2, SIGNAL(clicked()),
this, SLOT(toggleWindow2()));
QObject::connect(ui->toggleButton3, SIGNAL(clicked()),
this, SLOT(toggleWindow3()));
QObject::connect(ui->cleanLines, SIGNAL(clicked()),
this, SLOT(cleanLines()));
QObject::connect(ui->cleanAmounts, SIGNAL(clicked()),
this, SLOT(cleanAmounters()));
QObject::connect(ui->cleanAll, SIGNAL(clicked()),
this, SLOT(cleanAll()));
QObject::connect(ui->checkBox3, SIGNAL(clicked()),
this, SLOT(toggleCounter3()));
QObject::connect(ui->checkBox4, SIGNAL(clicked()),
this, SLOT(toggleCounter4()));
QObject::connect(ui->checkBox5, SIGNAL(clicked()),
this, SLOT(toggleCounter5()));
QObject::connect(ui->checkBox6, SIGNAL(clicked()),
this, SLOT(toggleCounter6()));
load();
}
MainWindow::~MainWindow()
{
delete ui;
save();
}
//Discription slots'
void MainWindow::save() {
settings->setValue("nameCounterTop", ui->nameCounterTop->text());
settings->setValue("nameCounter1", ui->nameCounter1->text());
settings->setValue("nameCounter2", ui->nameCounter2->text());
settings->setValue("nameCounter3", ui->nameCounter3->text());
settings->setValue("nameCounter4", ui->nameCounter4->text());
settings->setValue("nameCounter5", ui->nameCounter5->text());
settings->setValue("nameCounter6", ui->nameCounter6->text());
settings->setValue("valueCounter1", ui->amounter1->value());
settings->setValue("valueCounter2", ui->amounter2->value());
settings->setValue("valueCounter3", ui->amounter3->value());
settings->setValue("valueCounter4", ui->amounter4->value());
settings->setValue("valueCounter5", ui->amounter5->value());
settings->setValue("valueCounter6", ui->amounter6->value());
}
void MainWindow::load() {
ui->nameCounterTop->setText(settings->value("nameCounterTop").toString());
ui->nameCounter1->setText(settings->value("nameCounter1").toString());
ui->nameCounter2->setText(settings->value("nameCounter2").toString());
ui->nameCounter3->setText(settings->value("nameCounter3").toString());
ui->nameCounter4->setText(settings->value("nameCounter4").toString());
ui->nameCounter5->setText(settings->value("nameCounter5").toString());
ui->nameCounter6->setText(settings->value("nameCounter6").toString());
ui->amounter1->setValue(settings->value("valueCounter1").toInt());
ui->amounter2->setValue(settings->value("valueCounter2").toInt());
ui->amounter3->setValue(settings->value("valueCounter3").toInt());
ui->amounter4->setValue(settings->value("valueCounter4").toInt());
ui->amounter5->setValue(settings->value("valueCounter5").toInt());
ui->amounter6->setValue(settings->value("valueCounter6").toInt());
}
void MainWindow::cleanLines() {
ui->nameCounter1->clear();
ui->nameCounter2->clear();
ui->nameCounter3->clear();
ui->nameCounter4->clear();
ui->nameCounter5->clear();
ui->nameCounter6->clear();
}
void MainWindow::cleanAmounters() {
ui->amounter1->setValue(0);
ui->amounter2->setValue(0);
ui->amounter3->setValue(0);
ui->amounter4->setValue(0);
ui->amounter5->setValue(0);
ui->amounter6->setValue(0);
}
void MainWindow::cleanAll() {
ui->nameCounterTop->clear();
ui->checkBox3->setChecked(0);
emit MainWindow::toggleCounter3();
ui->checkBox4->setChecked(0);
emit MainWindow::toggleCounter4();
ui->checkBox5->setChecked(0);
emit MainWindow::toggleCounter5();
ui->checkBox6->setChecked(0);
emit MainWindow::toggleCounter6();
emit MainWindow::cleanLines();
emit MainWindow::cleanAmounters();
}
void MainWindow::toggleCounter3(){
if(!ui->checkBox3->isChecked()) {
ui->amounter3->setEnabled(0);
ui->nameCounter3->setEnabled(0);
} else {
ui->amounter3->setEnabled(1);
ui->nameCounter3->setEnabled(1);
}
}
void MainWindow::toggleCounter4(){
if(!ui->checkBox4->isChecked()) {
ui->amounter4->setEnabled(0);
ui->nameCounter4->setEnabled(0);
} else {
ui->amounter4->setEnabled(1);
ui->nameCounter4->setEnabled(1);
}
}
void MainWindow::toggleCounter5(){
if(!ui->checkBox5->isChecked()) {
ui->amounter5->setEnabled(0);
ui->nameCounter5->setEnabled(0);
} else {
ui->amounter5->setEnabled(1);
ui->nameCounter5->setEnabled(1);
}
}
void MainWindow::toggleCounter6(){
if(!ui->checkBox6->isChecked()) {
ui->amounter6->setEnabled(0);
ui->nameCounter6->setEnabled(0);
} else {
ui->amounter6->setEnabled(1);
ui->nameCounter6->setEnabled(1);
}
}
void MainWindow::toggleWindow2() {
counter_2->show();
this->close();
}
void MainWindow::toggleWindow3() {
counter_3->show();
this->close();
}
counter2.h:
#ifndef COUNTER2_H
#define COUNTER2_H
#include <QWidget>
#include <QtWidgets>
namespace Ui {class counter2;}
class counter2 : public QWidget
{
Q_OBJECT
public:
explicit counter2(QWidget *parent = nullptr);
~counter2();
signals :
void toggleToCounter1();
void toggleToCounter2();
void toggleToCounter3();
private:
Ui::counter2 *ui;
counter2* counter_2;
counter2* counter_3;
QSettings* settings1;
public:
void save();
void load();
private slots:
void toggleWindow1();
void toggleWindow2();
void toggleWindow3();
void cleanLines();
void cleanAmounters();
void cleanAll();
void toggleCounter3();
void toggleCounter4();
void toggleCounter5();
void toggleCounter6();
};
#endif // COUNTER2_H
counter2.cpp: //здесь не всё ок((
#include "counter2.h"
#include "ui_counter2.h"
counter2::counter2(QWidget *parent) :
QWidget(parent),
ui(new Ui::counter2)
{
ui->setupUi(this);
settings1 = new QSettings("SimpleStudio", "Counter2", this);
//Diclaration variables & QObject::connect
connect(ui->toggleButton1, SIGNAL(clicked()),
this, SLOT(toggleWindow1()));
connect(ui->toggleButton2, SIGNAL(clicked()),
this, SLOT(toggleWindow2()));
connect(ui->toggleButton3, SIGNAL(clicked()),
this, SLOT(toggleWindow3()));
QObject::connect(ui->cleanLines, SIGNAL(clicked()),
this, SLOT(cleanLines()));
QObject::connect(ui->cleanAmounts, SIGNAL(clicked()),
this, SLOT(cleanAmounters()));
QObject::connect(ui->cleanAll, SIGNAL(clicked()),
this, SLOT(cleanAll()));
QObject::connect(ui->checkBox3, SIGNAL(clicked()),
this, SLOT(toggleCounter3()));
QObject::connect(ui->checkBox4, SIGNAL(clicked()),
this, SLOT(toggleCounter4()));
QObject::connect(ui->checkBox5, SIGNAL(clicked()),
this, SLOT(toggleCounter5()));
QObject::connect(ui->checkBox6, SIGNAL(clicked()),
this, SLOT(toggleCounter6()));
counter2::load();
}
counter2::~counter2()
{
delete ui;
counter2::save();
}
//Discription slots'
void counter2::save()
{
settings1->setValue("nameCounterTop", ui->nameCounterTop->text());
settings1->setValue("nameCounter1", ui->nameCounter1->text());
settings1->setValue("nameCounter2", ui->nameCounter2->text());
settings1->setValue("nameCounter3", ui->nameCounter3->text());
settings1->setValue("nameCounter4", ui->nameCounter4->text());
settings1->setValue("nameCounter5", ui->nameCounter5->text());
settings1->setValue("nameCounter6", ui->nameCounter6->text());
settings1->setValue("valueCounter1", ui->amounter1->value());
settings1->setValue("valueCounter2", ui->amounter2->value());
settings1->setValue("valueCounter3", ui->amounter3->value());
settings1->setValue("valueCounter4", ui->amounter4->value());
settings1->setValue("valueCounter5", ui->amounter5->value());
settings1->setValue("valueCounter6", ui->amounter6->value());
}
void counter2::load()
{
ui->nameCounterTop->setText(settings1->value("nameCounterTop").toString());
ui->nameCounter1->setText(settings1->value("nameCounter1").toString());
ui->nameCounter2->setText(settings1->value("nameCounter2").toString());
ui->nameCounter3->setText(settings1->value("nameCounter3").toString());
ui->nameCounter4->setText(settings1->value("nameCounter4").toString());
ui->nameCounter5->setText(settings1->value("nameCounter5").toString());
ui->nameCounter6->setText(settings1->value("nameCounter6").toString());
ui->amounter1->setValue(settings1->value("valueCounter1").toInt());
ui->amounter2->setValue(settings1->value("valueCounter2").toInt());
ui->amounter3->setValue(settings1->value("valueCounter3").toInt());
ui->amounter4->setValue(settings1->value("valueCounter4").toInt());
ui->amounter5->setValue(settings1->value("valueCounter5").toInt());
ui->amounter6->setValue(settings1->value("valueCounter6").toInt());
}
void counter2::cleanLines() {
ui->nameCounter1->clear();
ui->nameCounter2->clear();
ui->nameCounter3->clear();
ui->nameCounter4->clear();
ui->nameCounter5->clear();
ui->nameCounter6->clear();
}
void counter2::cleanAmounters() {
ui->amounter1->setValue(0);
ui->amounter2->setValue(0);
ui->amounter3->setValue(0);
ui->amounter4->setValue(0);
ui->amounter5->setValue(0);
ui->amounter6->setValue(0);
}
void counter2::cleanAll() {
ui->nameCounterTop->clear();
ui->checkBox3->setChecked(0);
emit counter2::toggleCounter3();
ui->checkBox4->setChecked(0);
emit counter2::toggleCounter4();
ui->checkBox5->setChecked(0);
emit counter2::toggleCounter5();
ui->checkBox6->setChecked(0);
emit counter2::toggleCounter6();
emit counter2::cleanLines();
emit counter2::cleanAmounters();
}
void counter2::toggleCounter3(){
if(!ui->checkBox3->isChecked()) {
ui->amounter3->setEnabled(0);
ui->nameCounter3->setEnabled(0);
} else {
ui->amounter3->setEnabled(1);
ui->nameCounter3->setEnabled(1);
}
}
void counter2::toggleCounter4(){
if(!ui->checkBox4->isChecked()) {
ui->amounter4->setEnabled(0);
ui->nameCounter4->setEnabled(0);
} else {
ui->amounter4->setEnabled(1);
ui->nameCounter4->setEnabled(1);
}
}
void counter2::toggleCounter5(){
if(!ui->checkBox5->isChecked()) {
ui->amounter5->setEnabled(0);
ui->nameCounter5->setEnabled(0);
} else {
ui->amounter5->setEnabled(1);
ui->nameCounter5->setEnabled(1);
}
}
void counter2::toggleCounter6(){
if(!ui->checkBox6->isChecked()) {
ui->amounter6->setEnabled(0);
ui->nameCounter6->setEnabled(0);
} else {
ui->amounter6->setEnabled(1);
ui->nameCounter6->setEnabled(1);
ui->nameCounter6->setCursorPosition(int());
}
}
void counter2::toggleWindow1() {
emit toggleToCounter1();
this->close();
}
void counter2::toggleWindow2() {
emit toggleToCounter2();
this->close();
}
void counter2::toggleWindow3() {
emit toggleToCounter3();
this->close();
}
В папке counter1 есть файлы со значениями, а в counter2 - нету
1)
delete ui;
counter2::save();
Вы сначала удаляете гуй, а потом в функции counter2::save
вы обращаетесь к ui settings1->setValue("nameCounterTop", ui->nameCounterTop->text());
В обоих случаях это ошибка
Правильно сначала сохранить все значения, а потом удалить гуй, вот так:
MainWindow::~MainWindow()
{
save();
delete ui;
}
counter2::~counter2()
{
save();
delete ui;
}
2) объекты класса counter2
создаются динамически (через new), что значит, что их надо удалять вручную, иначе будет утечка памяти (память была веделена, но не освобождена).
На данный момент у вас объекты counter_2 и counter_2 нигде не удаляются, что значит и деструктор класса counter2
не вызывается и в реестр ничего не пишется.
Перепишите деструктор следующим образом:
MainWindow::~MainWindow()
{
save(); // Вызываем сохранение MainWindow
delete counter_2; // удаляем counter_2, что вызовет сохранение
delete counter_3; // удаляем counter_3, аналогично
delete settings; // удаляем settings, т.к. он тоже создан динамически
delete ui; // удаляем гуй, т.к. он больше не нужен
}
UPD:
Чтобы значения сохранялись для обоих счетчиков их надо как-то отделить друг от друга, проще всего это сделать с помощью дополнительного текстового поля:
class counter2 : public QWidget
{
...
public:
explicit counter2(const QString& registry, QWidget *parent = nullptr);
...
private:
QString m_registry;
...
}
Конструктор переделаем так:
counter2::counter2(const QString& registry, QWidget *parent /*= nullptr*/) :
QWidget(parent),
ui(new Ui::counter2),
m_registry(registry)
{
...
settings1 = new QSettings("SimpleStudio", m_registry, this); // теперь каждый счетчик будет записываться согласно значению m_registry
...
}
А в главном окне нам надо задать уникальные имена для счетчиков
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
counter_2 = new counter2("Counter2");
counter_3 = new counter2("Counter3");
...
Теперь каждый счетчик будет записываться в свою ветку регистра
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Виртуальный выделенный сервер (VDS) становится отличным выбором
Пытаюсь использовать паттерн MVCКак лучше организовать хранение модели и представления в контроллере? Вижу 2 варианта:
Не могу понять где наапортачилТолько начал изучать С++ и предомной стоит такая задача, найти количество букы "а" в строке которая передаётся...
Есть вектор с заданным размером: