IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Qt Discussion :

Sérialisation d'un circuit


Sujet :

Qt

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2009
    Messages : 11
    Par défaut Sérialisation d'un circuit
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    que te dit le debugger?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2009
    Messages : 11
    Par défaut
    Quand je lance le debugger, je m'aperçois que l'application passe beaucoup de fois dans le destructeur de la classe Circuit. Le problème se situant sur la ligne ou je crée une nouvelle instance de circuit a partir du QSettings.

    Voici ce que contient l'adresse du pointeur qui pointe sur 0x0000000 :
    0 QMap<QGraphicsItem const*, QMap<int, QVariant> >::detach qmap.h 172

Discussions similaires

  1. [Sérialisation] StackOverFlowError levée
    Par ptitjack dans le forum Général Java
    Réponses: 9
    Dernier message: 04/11/2004, 13h27
  2. [Serializable][image] Sérialiser une image
    Par Galima dans le forum Graphisme
    Réponses: 7
    Dernier message: 01/07/2004, 18h12
  3. Sérialisation avec sockets
    Par sebi77 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 03/05/2004, 20h24
  4. Réponses: 4
    Dernier message: 16/03/2004, 18h03
  5. SGBD ou sérialisation
    Par tiboleo dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 07/10/2003, 16h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo