Bonjour,
Pour un jeu de voiture, que je crée en Qt, il me faudrait sérialiser un objet de la classe "Circuit" qui hérite de QGraphicsItem.
Cette classe contient plusieurs attributs de type QPoint (qui représentent les position des différents objet sur le circuit) et un de type QPainterPath (qui représente la piste du circuit).
J'ai feuilleté les différents forum et tuto et j'en ai fait le code ainsi :
Circuit.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
|
#ifndef CIRCUIT_H
#define CIRCUIT_H
#include <QVariant>
#include <QGraphicsPathItem>
#include <QPoint>
#include <QPainterPath>
Q_DECLARE_METATYPE(QPainterPath);
class Circuit : public QGraphicsItem
{
public:
//Constructeur de la class Circuit
Circuit(int nbTour=1, QGraphicsItem * parent = 0);
Circuit(const Circuit &copie);
~Circuit();
//Méthodes de la class Circuit
int getNbTourTotal(void);
QPoint getPosCar1(void) const;
QPoint getPosCar2(void) const;
QPoint getPosCar3(void) const;
QPoint getPosCar4(void) const;
QPoint getPosLigneDep(void) const;
QList<QPoint> getlistPosCheckPoint(void) const;
QList<QPoint> getlistPosBonus(void) const;
QList<QPoint> getlistPosMalus(void) const;
QRectF getPistePos(void) const;
QPainterPath shape () const;
QRectF boundingRect() const;
int type() const;
void setNbTourTotal(int nbTour);
void paint(QPainter *painter, const QStyleOptionGraphicsItem *, QWidget *);
static void initContactSystem ();
private:
QPainterPath piste;
QPoint posLigneDep;
QPoint posCar1;
QPoint posCar2;
QPoint posCar3;
QPoint posCar4;
QList<QPoint> listPosCheckPoint;
QList<QPoint> listPosBonus;
QList<QPoint> listPosMalus;
int nbTourTotal;
friend QDataStream &operator>> (QDataStream&, Circuit&);
friend QDataStream &operator<< (QDataStream&, const Circuit&);
};
Q_DECLARE_METATYPE(Circuit)
QDataStream & operator << (QDataStream & out, const Circuit &o);
QDataStream & operator >> (QDataStream & in, Circuit &o);
#endif // CIRCUIT_H |
les fonctions de serialization de Circuit.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
void Circuit::initContactSystem ()
{
qRegisterMetaTypeStreamOperators<Circuit>("Circuit");
qMetaTypeId<Circuit>(); // Teste la validité de la classe Circuit
}
QDataStream &operator>>(QDataStream &in, Circuit &o)
{
in >> o.posLigneDep >> o.posCar1 >> o.posCar2 >> o.posCar3 >> o.posCar4 >> o.listPosCheckPoint >> o.listPosBonus >> o.listPosMalus >> o.nbTourTotal >> o.piste;
return in;
}
QDataStream &operator<<(QDataStream &out, const Circuit &o)
{
out << o.posLigneDep << o.posCar1 << o.posCar2 << o.posCar3 << o.posCar4 << o.listPosCheckPoint << o.listPosBonus << o.listPosMalus << o.nbTourTotal << o.piste;
return out;
} |
L'utilisation dans un autre fichier :
1 2 3 4 5 6 7 8
|
QFile::remove("Circuit1.ini");
QSettings fichier_ecrire("Circuit1.ini", QSettings::IniFormat);
fichier_ecrire.setValue("Circuit", qVariantFromValue(*circuit));
fichier_ecrire.sync();
QSettings fichier_lire("Circuit1.ini", QSettings::IniFormat);
circuit = new Circuit(fichier_lire.value("Circuit", qVariantFromValue(Circuit())).value<Circuit>()); |
Le fichier .ini est bien crée, j'arrive a récupérer a afficher le circuit. Cependant, il y a une erreur d'application :
L'instruction à "0x00fe1d39" emploie l'adresse mémoire "0x0000000000". La mémoire ne peut pas être "read".
Avez-vous des idées quand à l'origine du problème ? Dois-je sauver des données inhérantes à l'héritage de QGraphicsItem ?
Merci de m'avoir lu et je vous souhaite une bonne journée.
Partager