Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Qt Serializzare
Forum - C/C++ - Qt Serializzare

Avatar
Thejuster (Member)
Guru^2


Messaggi: 1879
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?


PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1164
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 (Member)
Guru^2


Messaggi: 1879
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?


PM Quote