Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Qt Serializzare
Forum - C/C++ - Qt Serializzare

Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 11:48
Venerdì, 02/11/2018
Come da titolo, non sò se sbaglio qualcosa nel procedimento,
o faccio tutto completamente in modo sbagliato.

Purtroppo le mie conoscenze del C# influiscono incredibilmente sulla stesura del codice C++.
e molte delle volte mi confondo.

il mio metodo è quello di usare il QDataStream per scrivere in modalità binaria sul file.

in primis ho una classe


mapeditor.h
Codice sorgente - presumibilmente C/C++

  1. QPixmap map;
  2.     Tileset *tileset;
  3.    
  4.  
  5.     //structure
  6.     struct Tile
  7.     {
  8.     public:
  9.         int ID;
  10.         int x,y,w,h;
  11.         QRect rect;
  12.     };
  13.  
  14.  
  15.     QList<Tile> Tiles;





Successivamente, dal main effettuo questa operazione

Codice sorgente - presumibilmente C/C++

  1. QString file = QFileDialog::getSaveFileName(this,
  2.                                                 tr("Seleziona il file da salvare"),"",
  3.                                                 tr("File Mappa (*.mp2d)"));
  4.     QFile f(file);
  5.  
  6.     if(!f.open(QIODevice::WriteOnly))
  7.     {
  8.              
  9.     }else
  10.     {
  11.         QDataStream out(&f);
  12.         out.setVersion(QDataStream::Qt_4_8);
  13.  
  14.         //
  15.         mapeditor *m = new mapeditor();
  16.  
  17.         m->Tiles = ui->maps->Tiles; // Applico alla nuova variabile il QList<Tile> con i valori attualmente presenti sulla mappa
  18.  
  19.         m->tileset = ui->maps->tileset; //Stesso procedimento, copio il Pixmap disponibile nella variabile temporanea.
  20.  
  21.         out << m; //Scrivo la classe su file.
  22.  
  23.         f.flush();
  24.         f.close();
  25.  
  26.  
  27.         //Test per verificare se i tiles inseriti nella nuova classe corrispondono a quelli presenti sulla mappa.
  28.         QMessageBox::information(this,QString::number(m->Tiles.count()),tr("CONTA DEI BLOCCHI INSERITI NELLA MAPPA"),QMessageBox::Ok);
  29.  
  30.     }




Il programma mi crea il file, ma il suo pesò e di solo 1kb
Mentre il Pixmap da salvare e molto più grande, quindi credo anche i vari dati contenuti nella lista.

aprendo il file dal blocco notes, vedo unicamente un simbolo ascii e niente più.
Dov'è il problema?


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 16:55
Sabato, 03/11/2018
Cosi al volo, immagino che
Codice sorgente - presumibilmente C/C++

  1. out << m;


non vada a serializzare la classe, ma a scrivere in out il valore di m, che è un puntatore. questo spiegherebbe perche sul tuo file trovi solo un carattere visibile. Inoltre sei tu il primo a dire che fai confusione con il C# dove ogni variabile è oggetto, e quindi puntatori e istanze non si separano mai, a differenza del C++

PM Quote
Avatar
Thejuster (Admin)
Guru^2


Messaggi: 2305
Iscritto: 04/05/2008

Segnala al moderatore
Postato alle 9:09
Giovedì, 08/11/2018
Roby ho fatto diversi tentativi ma ricevendo sempre erorre.

Ho creato una nuova classe da serializzare, ma qualsiasi dato che tento di inserire
al suo interno è errore

la classe è questa

Codice sorgente - presumibilmente C++

  1. #include <QRect>
  2. #include <QList>
  3. #include <QDataStream>
  4. #include <QString>
  5. #include <QDataStream>>
  6.  
  7.  
  8. #ifndef MAPPYSAVER_H
  9. #define MAPPYSAVER_H
  10.  
  11.  
  12. class MappySaver
  13. {
  14.  
  15. public:
  16.  
  17.  
  18.     MappySaver();
  19.     //structure
  20.     struct Tile
  21.     {
  22.     public:
  23.         int ID;
  24.         int x,y,w,h;
  25.         QRect rect;
  26.     };
  27.  
  28.  
  29.     QList<Tile> Tiles;
  30.  
  31.     QObject t;
  32.  
  33.     Tile tile;
  34.  
  35.  
  36.  
  37. };
  38.  
  39. //operatori da usare per la serializzazione
  40. QDataStream &operator <<(QDataStream &stream,   const MappySaver &saver);
  41. QDataStream &operator >>(QDataStream &stream, MappySaver &saver);
  42.  
  43.  
  44.  
  45. #endif // MAPPYSAVER_H



il classe è identica a quella usata come elemento nell'editor.
solo che ovviamente la classe sull'editor è basata su QWidget mentre questa è una semplice classe vuota.
con la differenza dell'overload degli operatori.

Come posso procere?

qualsiasi tenativo di passare dati dal widget alla classe mi dà errore.

potreisti farmi un esempio?


https://mire.forumfree.it/ - Mire Engine
C# UI Designer
PM Quote