Qt - QJson GUI - nie zapisuje wpisanych danych z kontrolek

1

Zrobiłem sobie taki program do zapisywania plików JSON

screenshot-20210512103832.png

gdy wpisuję jakieś dane w pole QLineEdit to wpisane wartości mi się nie zapisują do pliku, tylko za każdym razem zrzuca mi się zawartość ustawień które ustawiłem za pomocą konstruktorów

connect do obiektów QLineEdit i QComboBox zostały wykonane i działają i wyglądają tak:

QObject::connect(ComboBox, QOverload<int>::of(&QComboBox::currentIndexChanged), mwNetwork, &Network::setConnect);
QObject::connect(IPDatabase, &QLineEdit::textEdited, mwNetwork, &Network::setAddressIPv4);

slot wygląda tak - drugi jest nie podłączony

class Network : public QObject
{
Q_OBJECT

public slots:

void setAddressIPv4(const QString &_AddreesIPv4){
        nIPv4 = _AddreesIPv4;

        qDebug()<< "slot"<< nIPv4;
    }
}

Natomiast struktura pliku JSON odbywa się tutaj i wygląda tak

class Settings : public QObject
{
    Q_OBJECT

public slots:

        void SaveSettings(/*QJsonObject &JsonObject*/){
        QJsonObject myJsonObject, myJsonObjectSettings, JsonObjectNetwork, _JsonObjectNetwork, JsonObjectData, _JsonObjectData;

        myNetworkSettings.WriteNetworkSettings(JsonObjectNetwork);
        _JsonObjectNetwork["network"] = myNetworkSettings.ShowNetworkSettings();

        for(QString &str : _JsonObjectNetwork.keys()){
            myJsonObjectSettings.insert(str, JsonObjectNetwork);
        }

        myDataSettings.WriteDataSettings(JsonObjectData);
        _JsonObjectData["data-from"] = myDataSettings.ShowDataSettings();

        for(QString &str : _JsonObjectData.keys()){
            myJsonObjectSettings.insert(str, JsonObjectData);
        }

        myJsonObject["settings"] =  myJsonObjectSettings;

        QJsonDocument JsonDocument;
        JsonDocument.setObject(myJsonObject);

        QFile SaveFileToJson;
        SaveFileToJson.setFileName(QString("settings.json"));

        if(!SaveFileToJson.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)){
            qDebug()<< "Blad otwarcia pliku";
        }
        else{
            SaveFileToJson.write(JsonDocument.toJson());
            SaveFileToJson.flush();
        }
}

w funkcji void SaveSettings(/*QJsonObject &JsonObject*/) tymczasowo zakomentowałem argument funkcji, ponieważ slot clicked jest niekompatybilny z taką funkcją. Podejrzewam, że robię coś źle w tej funkcji, tylko nie wiem co. W razie potrzeby publikuję cały kod, który przy okazji tego wątku może być przez was poddany analizie code review - jest pewna niekonsekwencja w nazewnictwie zmiennych ale nadal pracuję nad swoim sposobem ich nazywania

kod projektu QStackedWidget.7z

1

Widzę tylko chaos.

  1. Pilnuj wcięć kodu
  2. przestrzegaj naming convention, najlepiej tego zdefinowanego dla Qt: nazwy zmiennych z małej litery "cammel case", to samo nazwy funkcji
  3. Oddziel kod tworzący JSona (QJsonDocument) od jego zapisywania (osobne funkcje).
  4. napisz wyraźnie w czym problem, co już ustaliłeś za pomocą debugger-a.
  5. Qt zapewnia QSettings do trzymania ustawień aplikacji - nie trzeba dłubać przy JSon-ie.
0

@MarekR22:

Widzę tylko chaos.

Gdzie jest chaos ? Bo nie rozumiem ? Pewnie chodzi ci o podział na "gui" i "engine" ? Kod ma być podzielony na warstwę prezentacyjną i biznesową - tyle, że zrobiłem swoje nazewnictwo aby lepiej mi się kojarzyło

Pilnuj wcięć kodu

ale co z tymi wcięciami ? Bo creator sam robi wcięcia...

przestrzegaj naming convention

co to jest "naming vonvention" ?

Jeżeli chodzi o nazwy funkcji, to chyba ktoś doradzał z dużej litery ?

Oddziel kod tworzący JSona (QJsonDocument) od jego zapisywania (osobne funkcje).

ok, coś wymyślę, sądziłem, że jak to wrzucę w jedno, to będzie łatwiej

napisz wyraźnie w czym problem, co już ustaliłeś za pomocą debugger-a.

sam poszukuję "gdzie spieprzyłem" ale ogólnie chodzi mi o to, że funkcja Settings::SaveSettings nie zapisuje wartości które wpiszę w LineEdita i wydaje mi się, że tam jest błąd - debuggera nie umiem obsłużyć.

Qt zapewnia QSettings do trzymania ustawień aplikacji - nie trzeba dłubać przy JSon-ie.

z początku używałem, QSettings ale ktoś z was polecił mi JSON-a ponieważ jest powszechny, a pliki ini są już przestarzałe, więc skorzystałem z rady

0
zkubinski napisał(a):

@MarekR22:

Widzę tylko chaos.

Gdzie jest chaos ? Bo nie rozumiem ? Pewnie chodzi ci o podział na "gui" i "engine" ? Kod ma być podzielony na warstwę prezentacyjną i biznesową - tyle, że zrobiłem swoje nazewnictwo aby lepiej mi się kojarzyło

W twoim pytaniu.

Pilnuj wcięć kodu

ale co z tymi wcięciami ? Bo creator sam robi wcięcia...

No to popatrz na swoje pytanie i powiedz mi, że z wcięciami wszystko jest ok (do zip-a nie zaglądałem).

przestrzegaj naming convention

co to jest "naming vonvention" ?

Google nie boli i na dodatek ogólnie opisałęm co jest nie tak.

Jeżeli chodzi o nazwy funkcji, to chyba ktoś doradzał z dużej litery ?

Oddziel kod tworzący JSona (QJsonDocument) od jego zapisywania (osobne funkcje).

ok, coś wymyślę, sądziłem, że jak to wrzucę w jedno, to będzie łatwiej

Jak w języku polskim trudniej zrozumieć zdania wielokrotnie złożone, tak trudniej zrozumieć kod funkcji, w której jest wszystko.

Qt zapewnia QSettings do trzymania ustawień aplikacji - nie trzeba dłubać przy JSon-ie.

z początku używałem, QSettings ale ktoś z was polecił mi JSON-a ponieważ jest powszechny, a pliki ini są już przestarzałe, więc skorzystałem z rady

QSettings jest abstrakcją na różne metody zapisywania ustawień używane przez różne systemy:

QSettings Class | Qt Core 5.15.4

Detailed Description

Users normally expect an application to remember its settings (window sizes and positions, options, etc.) across sessions. This information is often stored in the system registry on Windows, and in property list files on macOS and iOS. On Unix systems, in the absence of a standard, many applications (including the KDE applications) use INI text files.

QSettings is an abstraction around these technologies, enabling you to save and restore application settings in a portable manner. It also supports custom storage formats.

0

@MarekR22:

Poza tym jak odpalę debuggera to w tych oknach mam

screenshot-20210512125008.png

i szczerze mówiąc nie wiem co mam zrobić aby cokolwiek tam zobaczyć - kiedyś jak debugowałem pętle, to z automatu pojawiał mi się zdeasemblowany kod i mogłem coś porobić np podejrzeć jakie wartości w danym momencie ma pętla - a teraz to nie mam pojęcia jak się do tego zabrać

1

Umiesz używać debugera? Wstawiłeś breakpoint, żeby program wstrzymał wykonanie w potrzebnym miejscu? Umiesz podglądać wartości zmiennych?
Ten screenshot sugeruje, że raczej nie.

0

@MarekR22:

Wstawiłeś breakpoint

screenshot-20210512130724.png

ten brakpoint wystarczy ? To taka podstawa podstaw ? Czy coś jeszcze trzeba zrobić ?

1

Myślę, że by było czytelniej, gdybyś nie miał słowa json w każdej niepustej linijce poza trzema. Poza tym, to że trzymasz to w JSONie, to powinien być szczegół implementacji.
Masz też mylące nazewnictwo - QFile SaveFileToJson sugeruje czasownik, czyli funkcję, podczas gdy jest to obiekt.

0

Zobacz co zwraca JsonDocument.toJson(), pewnie nic skoro nic nie zapisuje. W takim razie idziesz debugerem po poszczgólnych JsonObjects i sprawdzasz co zawierają.
Śmierdzi mi ten transfer danych z i bez podłogi na początku, ale to nic poza wyczuciem:

      for(QString &str : _JsonObjectNetwork.keys()){
            myJsonObjectSettings.insert(str, JsonObjectNetwork);
        }
1

https://google.github.io/styleguide/cppguide.html
https://clang.llvm.org/extra/clang-tidy/
co debugowania wejdź na yt są filmiki z opisem jak to robić.

Z ostatnich tematów zrozumiałem że nie jesteś młody, czy ty się chcesz przebranżowić?

Podejdź do tego inaczej weź jakiś testowy kod zrób. Całkowicie w jednej funkcji/klasie. Niech będą stringi zahardkodowane i próbuj coś zapisać do pliku. Tak żebyś zrozumiał co i jak na jak najmniejszym kawałku kodu. Bez żadnych sygnałów itp.
Po prostu program się odpala, otwiera plik, zapisuje testowego jsona do pliku itd.

0

@zkubinski: Masz dwie instancje klasy Network.

  • Jedna jest składową klasy Settings - ta jest zapisywana do pliku, ale nigdy nie jest modyfikowana
  • Druga jest składową klasy Page1 - ta jest modyfikowana, ale nigdy nie jest zapisywana
0

@tajny_agent:

popatrzyłem i wiedziałem, że coś jest "dwa razy" ale nie potrafiłem zlokalizować błędu.

Czy miałbyś pomysł jak to rozwiązać ? Bo w obecnej chwili przyszło mi na myśl, żeby wysłać sygnał z klasy Page1 o dokonanych zmianach do klasy Settings - pytanie czy ma to sens czy jest lepsze i prostsze rozwiązanie ?

1

Oddzielenie danych od prezentacji to dobry kierunek.

0

nie sprawdzałem całego kodu ale widzę że kolega już to zrobił. Tu się nasuwa pytanie czy czytałeś te książki które polecaliśmy np. clean code?

O szeroko stosowanym w qt wzorcu mówi też sama dokumentacja
https://doc.qt.io/qt-5/model-view-programming.html

0
MarekR22 napisał(a):
  1. Qt zapewnia QSettings do trzymania ustawień aplikacji - nie trzeba dłubać przy JSon-ie.

Osobiście preferuję trzymanie configów/settingsów w JSON. Szczególnie, że mogę sobie je bardzo przyjemnie serializować w sposób zjadalny dla api w innych językach (mam np. serwer http odpowiedzialny za api, serializacja polega na dodaniu tylko pól Q_GADGET i Q_PROPERTY): https://github.com/Skycoder42/QtJsonSerializer

0

@tajny_agent:

Masz dwie instancje klasy Network.

zrobiłem sobie prosty przykład aby dojść jak zrobić jedną instancję i szczerze mówiąc mam z tym problem, bo nie wiem jak zrobić aby była jedna instancja - oto uproszczony przykład

plik mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QWidget>
#include <QPushButton>
#include <QLineEdit>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QFile>

#include "network.h"

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

public slots:
    void SaveJs(){
        SaveFile = new QFile();
        SaveFile->setFileName("settings.json");

        if(!SaveFile->open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)){
            qDebug()<< "blad otwarcia bufora pliku";
        }
        else{
            SaveFile->write(JsDoc.toJson());
            SaveFile->flush();
        }
    }

private:
    QWidget *MainWidget;
    QVBoxLayout *MainLayout;
    QHBoxLayout *Layout;
    QLineEdit *LineEdit;
    QPushButton *PbSave, *PbExit;

    QFile *SaveFile;
    QJsonDocument JsDoc;
    QJsonObject *JsObj;
    Network *myNet;
};
#endif // MAINWINDOW_H

plik mainwindow.cpp

#include "mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    resize(300,200);

    MainWidget = new QWidget(this);

    MainLayout = new QVBoxLayout(MainWidget);

    LineEdit = new QLineEdit(this);
//    LineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);

    PbSave = new QPushButton(this);
    PbSave->setText(QString(tr("Zapisz")));

    PbExit = new QPushButton(this);
    PbExit->setText(QString(tr("Zamknij")));

    Layout = new QHBoxLayout();
    Layout->addWidget(PbSave);
    Layout->addWidget(PbExit);

    MainLayout->addWidget(LineEdit);
    MainLayout->addLayout(Layout);

    setCentralWidget(MainWidget);

    myNet = new Network;

    JsObj = new QJsonObject(myNet->NetworkSettings()); // tu jest gdzieś problem jak zrobić jedną instancję
    myNet->setNetworkSettings(*JsObj);  //i tu jest gdzieś problem jak zrobić jedną instancję 

    JsDoc.setObject(*JsObj);

    QObject::connect(LineEdit, &QLineEdit::textEdited, myNet, &Network::setIPAddress);
    QObject::connect(PbSave, &QPushButton::clicked, this, &MainWindow::SaveJs);
    QObject::connect(PbExit, &QPushButton::clicked, this, &MainWindow::close);
}

MainWindow::~MainWindow()
{
}


plik network.h

#ifndef NETWORK_H
#define NETWORK_H

#include <QObject>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QString>
#include <QDebug>

class Network : public QObject
{
    Q_OBJECT

public:
    Network();

    QString IPAddress(){
        return IPAddr;
    }

    void setNetworkSettings(QJsonObject &JsObject)
    {
        JsObject["ipaddr"] = IPAddr;

        nJsObject = JsObject;
    }

    QJsonObject NetworkSettings(){
        return nJsObject;
    }

public slots:
    void setIPAddress(const QString &ipv4){
        IPAddr = ipv4;
        nJsObject.insert("ipaddr", IPAddr);

        qDebug()<< nJsObject.value("ipaddr").toString();
    }

private:
    QString IPAddr;
    QJsonObject nJsObject;
};

#endif // NETWORK_H

I teraz pytanie jest takie co zrobić aby była jedna instancja i aby program rzeczywiście zapisywał to co wpiszę ? Czy ktoś pomoże ?

0

Ale jedną instancję czego? QJsonObject?
Na szybko na oko

JsDoc.setObject(myNet->NetworkSettings());
SaveFile->write(JsDoc.toJson());
SaveFile->flush();

EDIT: przy czym ten fix jest niczym John Constantine leczący rakowy kaszel syropem. Zadziała aż coś zmienisz i znowu się pogubisz. Przemyśl design.
Bo jeśli dobrze rozumiem Ty wszystko to tworzysz, ale zapisujesz QJsonObjecta z main window, podczas gdy właściwe ustawienia siedzą w networku, czy tak jest?

EDIT2:
@zkubinski: albo w jednym przechowuj referencję/pointer, w drugim instancję. Albo - niech każde trzyma swój fragment JSONa, który potem się gdzieś poskłada do kupy. Możliwości trochę masz. Tak na gorąco: JsDoca bym dał do metody SaveJs, a QJsonObject miał jeden zamiast dwóch.
I poza konkursem: zdecydowałbym się na konwencję, czy trzymasz obiekty dynamicznie alokowane (jeśli tak: w jakim stylu, C++ czy Qt, bo to drugie to nie jest idiomatyczny C++) czy jednak zgodne z czasem życia obiektu macierzystego.

0

@alagner:

niech każde trzyma swój fragment JSONa, który potem się gdzieś poskłada do kupy

to zrobiłem, tyle, że na chwilę obecną nie wiem jak zrobić "tą jedną" instancję, bo "te składanie" do kupy mi wychodzi ale już jedna instancja to nie bardzo...

JsDoca bym dał do metody SaveJs

masz na myśli aby dać funkcję SaveJs ale w klasie network ? A co jeśli będę miał JS podzielonego na kilka fragmentów - wtedy gdzie "SaveJS" ?

czy trzymasz obiekty dynamicznie alokowane (jeśli tak: w jakim stylu, C++ czy Qt, bo to drugie to nie jest idiomatyczny C++) czy jednak zgodne z czasem życia obiektu macierzystego.

tego nie rozumiem - czym się różni trzymanie dynamicznie alokowanych obiektów C++ od Qt ? Podasz jakiś przykład ?

0

JsDoca bym dał do metody SaveJs

masz na myśli aby dać funkcję SaveJs ale w klasie network ? A co jeśli będę miał JS podzielonego na kilka fragmentów - wtedy gdzie "SaveJS" ?

Mam na myśli dokładnie to co napisałem. Nie ma sensu żeby QJsonDocument JsDoc; byłem polem klasy, skoro jest używany tylko w zapisie.

tego nie rozumiem - czym się różni trzymanie dynamicznie alokowanych obiektów C++ od Qt ? Podasz jakiś przykład ?

https://stackoverflow.com/questions/2491707/memory-management-in-qt

to zrobiłem, tyle, że na chwilę obecną nie wiem jak zrobić "tą jedną" instancję, bo "te składanie" do kupy mi wychodzi ale już jedna instancja to nie bardzo...

Imho raczej jedną instancję podmieniasz na drugą.

0

Poprawiłem kod i działa i zapisuje wszystko co wpiszę do JSON-a. Chciałbym zapytać czy to co zrobiłem ma sens i jest dobrze zrobione, ponieważ użyłem funkcji QJsonObject::insert

całość wygląda tak

plik mainwindow.cpp

#include "mainwindow.h"
#include <QDebug>

MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent)
{
    resize(300,200);

    MainWidget = new QWidget(this);

    MainLayout = new QVBoxLayout(MainWidget);

    LineEdit = new QLineEdit(this);
//    LineEdit->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);

    PbSave = new QPushButton(this);
    PbSave->setText(QString(tr("Zapisz")));

    PbExit = new QPushButton(this);
    PbExit->setText(QString(tr("Zamknij")));

    Layout = new QHBoxLayout();
    Layout->addWidget(PbSave);
    Layout->addWidget(PbExit);

    MainLayout->addWidget(LineEdit);
    MainLayout->addLayout(Layout);

    setCentralWidget(MainWidget);

    myNet = new Network; //tutaj dokonałem zmian
    JsObj = new QJsonObject; //tutaj dokonałem zmian
    myNet->setNetworkSettings(*JsObj); //tutaj dokonałem zmian

    QObject::connect(LineEdit, &QLineEdit::textEdited, myNet, &Network::setIPAddress);
    QObject::connect(PbSave, &QPushButton::clicked, myNet, &Network::SaveJs); //tutaj dodałem slota zapisu do pliku
    QObject::connect(PbExit, &QPushButton::clicked, this, &MainWindow::close);
}

MainWindow::~MainWindow()
{
}

plik network.h

#ifndef NETWORK_H
#define NETWORK_H

#include <QObject>
#include <QJsonDocument>
#include <QJsonObject>
#include <QJsonArray>
#include <QJsonValue>
#include <QString>
#include <QFile>
#include <QDebug>

class Network : public QObject
{
    Q_OBJECT

public:
    Network();

    QString IPAddress(){
        return IPAddr;
    }

    void setNetworkSettings(QJsonObject &JsObject)
    {
        JsObject["ipaddr"] = IPAddr;

        nJsObject = JsObject;
    }

    QJsonObject NetworkSettings(){
        return nJsObject;
    }

public slots:
    void setIPAddress(const QString &ipv4){
        IPAddr = ipv4;

        QJsonObject::iterator i; //to dopisałem

        for(i = nJsObject.begin(); i != nJsObject.end(); ++i){ //całą pętlę też dopisałem
            if(i.key() == "ipaddr"){
                nJsObject.insert(i.key(), IPAddr); //czy da się obejść bez tej funkcji ?
            }
        }
    }

    void SaveJs(){ //dodałem tą funkcję
        QJsonDocument nJsDocument(nJsObject);

        SaveFile = new QFile();
        SaveFile->setFileName("settings.json");

        if(!SaveFile->open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate)){
            qDebug()<< "blad otwarcia bufora pliku";
        }
        else{
            SaveFile->write(nJsDocument.toJson());
            SaveFile->flush();
        }
    }

private:
    QString IPAddr;
    QJsonObject nJsObject;

    QFile *SaveFile;
};

#endif // NETWORK_H

i teraz pytanie jest takie, czy da radę zrobić to lepiej BEZ użycia funkcji QJsonObject::insert ? Fajnie by było gdybyście rozwiali moją wątpliwość

0

Ej, ale co cię tak ciągnie do tego new w każdym miejscu? Styl zły, ale też masz przez to wycieki pamięci. A w wielu miejscach tutaj, to nawet nie trzeba dynamicznej alokacji.

A co do pytania, to nie rozumiem. Skoro wiesz, że i.key() == "ipaddr", i potem robisz nJsObject.insert(i.key(), IPAddr);, to czemu w ogóle nie wywalić tej pętli, i nie zrobić tak:

nJsObject.insert("ipaddr", IPAddr);

Chyba, że chcesz się upewnić, że robimy to tylko jeśli "ipaddr" już wcześniej istniał (ale wtedy też zapewne istnieją lepsze opcje).

Z rzeczy do poprawienia jeszcze, masz niespójne formatowanie. Kodu zakomentowanego nie powinno być. Ponownie to co mówiłem już, SaveFile nie jest funkcją, a nazwałeś od czasownika. Przyłóż się troszkę bardziej!

0

@enedil:

A co do pytania, to nie rozumiem. Skoro wiesz, że i.key() == "ipaddr", i potem robisz nJsObject.insert(i.key(), IPAddr);, to czemu w ogóle nie wywalić tej pętli, i nie zrobić tak:
nJsObject.insert("ipaddr", IPAddr);

na początku zrobiłem jak mówisz ale stwierdziłem, że "co jeśli dojdzie tam więcej kluczy niż jeden ?" No to zrobiłem pętlę która sprawdzi jakie są klucze i wpisze w odpowiednie miejsca odpowiednie wartości.

Ej, ale co cię tak ciągnie do tego new w każdym miejscu? Styl zły, ale też masz przez to wycieki pamięci. A w wielu miejscach tutaj, to nawet nie trzeba dynamicznej alokacji.

nie wiem i co do wycieków, zgoda ale co mam robić ? Jak uniknąć wycieków ?

A co do pytania, to nie rozumiem.

czy da się uniknąć insert i zrobić zapis do JSON-a na samych zmiennych zawartych w klasie ?

Z rzeczy do poprawienia jeszcze, masz niespójne formatowanie. Kodu zakomentowanego nie powinno być. Ponownie to co mówiłem już, SaveFile nie jest funkcją, a nazwałeś od czasownika. Przyłóż się troszkę bardziej!

ok, robię co się da i próbuję ogarnąć ile się da - co do funkcji zmienię - muszę sobie wypisać na kartce jakiś schemat nazewnictwa

1

Layout = new QHBoxLayout(); EDIT: @kq ma rację, tu jest ok, zasugerowałem się brakiem parenta.
myNet = new Network; //tutaj dokonałem zmian Ale tu już pamięć cieknie
JsObj = new QJsonObject; //tutaj dokonałem zmian tu chyba też.
SaveFile = new QFile(); tu również

W ogóle to QT defaultowo generuje UIki w osobnej klasie instancjonowanej w MainWindow, radzę się tego trzymać, będzie czyściej.

czy da się uniknąć insert i zrobić zapis do JSON-a na samych zmiennych zawartych w klasie ?

nJsObject[i.key()]=IPAddr; chyba powinno też zadziałać. Kwestia stylu co czytelniej. Niemniej niezbyt też rozumiem pytanie.

nie wiem i co do wycieków, zgoda ale co mam robić ? Jak uniknąć wycieków ?

Wysłałem Ci już linka w poprzedniej odpowiedzi.

1

Za bardzo nie wiem co ta klasa Network ma robić, ale gmerać przy plikach nie powinna.
Raczej poszedłbym w tę stronę*:

class Network
{
  QString ipAddr;
public:
  void setAddr(QString const& newAddr);
  QJsonObject toJson() const;
};

I slot zapisu mógłby wyglądać mniej więcej:

void SomeWidget::OnSaveClicked()
{
  auto json = QJsonObject{};
  json["network"] = network.toJson();
  // ...wtłoczenie do QJsonDocument i zrzut do pliku
}

* - zakładając, że finalnie będzie bardziej skomplikowana, bo póki co spokojnie można ją przerobić na prosty struct

0

@tajny_agent:

Za bardzo nie wiem co ta klasa Network ma robić, ale gmerać przy plikach nie powinna.

zmieniłem i utworzyłem oddzielną klasę SettingsFile która zapisuje do pliku

tylko znowu mam problem z dwiema instancjami i nie mam pojęcia jak to poprawić. W powyższych postach udało mi się rozwiązać problem ale w tym projekcie to już kompletnie nie wiem co robię źle

I nie wiem który kod pokazać, bo sam nie wiem gdzie mam błąd... więc poniżej załączam cały kod, może ktoś z was zerknie i coś mi podpowie

Cały projekt jest tu -> QStackedWidget.7z

0

@alagner:

Wrzuć to chociaż na jakiegoś gitlaba żeby tego rozpakowywać nie trzeba było

@revcorey:

weź to wrzuć na github nikt nie będzie co chwilę nowe wersji ściągał szczególnie na firmowe komputery w pracy

Link do Kodu na GitLabie

0

OK, no to teraz w czym dokładnie jest problem? Znowu się zapisuje pusty json czy co dokładnie się dzieje?

0

@alagner:

OK, no to teraz w czym dokładnie jest problem? Znowu się zapisuje pusty json czy co dokładnie się dzieje?

plik jako taki zapisuje się poprawnie, tyle, że cały czas z domyślnymi ustawieniami wygenerowanymi przez konstruktory.

A ja chciałbym, żeby domyślne ustawienia były, tyle, że użytkownik może sobie potem cokolwiek zmienić jak mu coś nie pasuje i np chciałbym zmienić adres IP, wpisuję cokolwiek i do pliku mam zapisywanie domyślne ustawienia i nie wiem co i gdzie spieprzyłem

0

W Settings i Page1 trzymasz różne instancje Network, przypisania (między nimi) nie widzę.

2

QJsonDocument JsonDocument(FileSettings());

settingsfile.cpp

tymczasem w mainwindow.cpp

mySettingsFile = new SettingsFile;

To się nie dodaje.

Tu nie chodzi o Qt nie rozumiesz podstaw C++.
https://www.pluralsight.com/paths/c-plus-plus
a dopiero później qt
https://www.pluralsight.com/search?q=qt

Stary powiem ci coś nie obraź się, nie znam cię ale powiem to nim zmarnujesz więcej swojego czasu. Piszesz że od roku uczysz się qt i c++. Jak rozumiem chcesz się dostać do IT(bo z rozmów zrozumiałem że nie jesteś już młody czyli <18). Moja rada odpuść sobie przebranżowienie. Nie każdy nadaje się do IT. Nie mówię tego ze złośliwości ale jak na rok to kiepsko i chcę ci zaoszczędzić straconego czasu. To rada a nie szpila czy coś.

1 użytkowników online, w tym zalogowanych: 0, gości: 1