Mit Qt Klassen serialisieren



  • Ich versuche momentan eine Klasse zu serialisieren. Dazu habe ich ein kleines Tutorial gelesen, in dem steht das bei Klassen der QDataStream überladen werden muss. Hab es dann auch so gemacht wie in diesem Tutorial http://www.bogotobogo.com/Qt/Qt5_QFile_Serialization_Class.php

    Aber leider bekomme ich diese Fehlermeldung

    /home/ben/QtProjects/GhuulDoc/gconfiguration.cpp:26: Fehler: no match for 'operator<<' (operand types are 'QDataStream' and 'const QDir')
         out << config.rootPath;
             ^
    

    das sind die Klassen

    class gConfiguration
    {
    private:
        gConfiguration();
    
        //Singleton Instance Holder
        static gConfiguration *m_instance;
    
    public:
        //Singleton Instance Function
        static gConfiguration *getInstance();
    
        //this is the Path where we save all Documents
        QDir rootPath;
    
        //Overload QDataStream
        friend QDataStream &operator<<(QDataStream &out, const gConfiguration &config);
        friend QDataStream &operator>>(QDataStream &in, gConfiguration &config);
    };
    
    QDataStream &operator<<(QDataStream &out, const gConfiguration &config)
    {
        out << config.rootPath;
    
        return out;
    }
    
    QDataStream &operator>>(QDataStream &in, const gConfiguration &config)
    {
        config = gConfiguration::getInstance();
        in >> config.rootPath;
        return in;
    }
    

    Was mache ich falsch? Gibt es keinen leichteren Weg um zB Einstellungen einer Klasse zu speichern?

    edit: hab jetzt herausgefunden das Qt wohl kein QDir serialisieren kann. Hab das einfach zu einem QString geändert. Aber hab trotzdem noch einen Fehler

    /home/ben/QtProjects/GhuulDoc/gserializer.cpp:24: Fehler: no match for 'operator>>' (operand types are 'QDataStream' and 'gConfiguration*')
         in >> config;
            ^
    

    edit2: hab das Problem gefunden. beim wiederherstellen mit dem QDataStream muss das Ziel bei mir ein Pointer sein.



  • Ich finde, das Problem mit dem Serialisieren ist in C++ noch nicht wirklich zufriedenstellen gelöst. Man kann auch schon mal QDataStream verwenden, aber eher für irgendwas internes. Ab und zu willst du deine Daten aber vielleicht als XML oder JSON speichern. Gibt tausend verschiedene Lösungen, alle nicht wirklich optimal.



  • Habt ihr mal ein Beispiel wann bzw. warum man sowas braucht?



  • Ja mir wäre es auch lieb, dass man manche Zustände in einem Programm besser speichern und wiederherstellen kann. Ich hab mir einen QTreeView angelegt, den ich wohl leider nicht serialisieren kann. Da muss ich wohl XML oder eine Datenbank nehmen.



  • Ich hab mir einen QTreeView angelegt, den ich wohl leider nicht serialisieren kann. Da muss ich wohl XML oder eine Datenbank nehmen.

    Naja treeviews zu serialisieren klingt auch designtechnisch ned ganz so optimal ^^

    "Normal" hat man den (tree)view, der holt die Daten aus dem Modell und das Modell sollte eigentlich nur der (Zugriffs)Wrapper um die eigentlichen Datenklassen sein. Und diese sollten serialisiert werden ....

    Nen Trieview sollte nur ein Möglicher "Blick" auf die daten sein ...
    Sei denn man will EInstellungen des Users zum View speichern, das macht man aber meist mit Settings nicht mit Serialization (die settings sind meist doch nur nen Key value Store) ...

    Ciao ...



  • Eigentlich wollte ich jetzt meinen TreeView mit einer Datenbank verknüpfen. Hab dazu diesen Beitrag gelesen http://www.mimec.org/node/300. Leider fehlen mir gute Beispiele um das endgültig zu verstehen. Kennt da jemand eine gute Seite mit Beispielen? Oder hat jemand Libs die ich benutzen kann?



  • Bennisen schrieb:

    Eigentlich wollte ich jetzt meinen TreeView mit einer Datenbank verknüpfen. Hab dazu diesen Beitrag gelesen http://www.mimec.org/node/300. Leider fehlen mir gute Beispiele um das endgültig zu verstehen. Kennt da jemand eine gute Seite mit Beispielen? Oder hat jemand Libs die ich benutzen kann?

    Und was hat die Darstellung des Ergebnisses eines SQLQueries mit deiner Ursprünglichen Frage zu tun?
    Denn der link beschreibt wie man das Ergebnis mehrerer SQLQueries in einem TreeView anzeigt



  • Man kann alles in allem Speichern (XML, Datenbank) und wieder laden. Das ist alles kein Problem. Man sollte nur nicht unbedingt versuchen, das als "Serialisierung" zu bezeichnen und in ein gemeinsames, statisches Framework zu stecken. Was dabei rauskommt, hat mir noch nie gefallen.


Log in to reply