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 :

Enregistrer un projet


Sujet :

Qt

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Points : 14
    Points
    14
    Par défaut Enregistrer un projet
    Bonjour tout le monde,

    Je vous présente mon problème :
    J'utilise la MVC avec un QTreeView et un QAbstractItemModel.
    Mon interface fonctionne et je me lance à présent dans la sauvegarde d'un projet.
    L'idéal serait de sauvegarder le modèle (construit avec les données d'un QWizard) et ainsi quand je le charge, je retrouve mon QTreeView.
    J'ai vu qu'il était possible de des fichiers avec QFileDialog mais je ne vois pas du tout comment faire dans mon cas.
    Puis je sauvegarder directement ce que contient ma classe model (QTreeModel qui dérive de QAbstractItemModel) ou juste suavegarder ce que j'ai dans ma vue?

    Merci de votre aide.

    Jef

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    Salut,

    Alors je n'ai pas tout à fait compris ton problème, est ce un genre d'IDE que tu as fait, ou on peut créer et enregistrer des projets(1) ? Ou est ce que tu veux juste enregistrer ton model actuel à la fermeture, et le relancer au démarrage(2) ?

    Pour le 1, va voir du coté de QFile et QDataStream : le premier te sert à ouvrir/créer/fermer un fichier, le deuxième permet d'écrire dans ce QFile tous types de données. Pour enregister des types perso, il faut utiliser la macro qRegisterMetaType.

    Sinon pour le 2, il y a la classe QSettings.

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    Merci de la réponse, je vais me pencher du coté de QDataStream et je vous tiens au courant.
    Mais effectivement, j'ai une classe avec pas mal de données à l'intérieur que je veux sauvegarder, ce sont ces données qui peuvent recréer la vue.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    Rebonjour,

    j'ai essayé la solution avec QDataStream mais l'opérateur >> ne fonctionne pas avec ma classe malgré que je la déclare dans Q_DECLARE_METATYPE.
    De plus si j'essaie de passer la classe en QVariant, j'ai unable to save type 259.
    Donc je ne peux toujours pas enregistrer mes données.

    Quelqu'un a une idée?

    Merci

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    int qRegisterMetaType ( const char * typeName )

    Registers the type name typeName for the type T. Returns the internal ID used by QMetaType. Any class or struct that has a public default constructor, a public copy constructor and a public destructor can be registered.

    After a type has been registered, you can create and destroy objects of that type dynamically at run-time.

    This example registers the class MyClass:

    qRegisterMetaType<MyClass>("MyClass");
    Note: This function is thread-safe.

    See also qRegisterMetaTypeStreamOperators(), QMetaType::isRegistered(), and Q_DECLARE_METATYPE().
    Tu as bien utilisé cette fonction ? Tu as bien défini les constructeurs demandés pour ta classe ?

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    Citation Envoyé par Gulish Voir le message
    Tu as bien utilisé cette fonction ? Tu as bien défini les constructeurs demandés pour ta classe ?

    G.
    Non, je ne l'ai pas fait. J'ai utilisé Q_DECLARE_METATYPE() mais pas int qRegisterMetaType ( const char * typeName ).
    Quelle est la différence entre les deux je ne comprends pas trop ce qu'elles font.

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2007
    Messages
    774
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Finistère (Bretagne)

    Informations forums :
    Inscription : Mai 2007
    Messages : 774
    Points : 969
    Points
    969
    Par défaut
    To use the type T in QVariant, using Q_DECLARE_METATYPE() is sufficient. To use the type T in queued signal and slot connections, qRegisterMetaType<T>() must be called before the first connection is established.
    QDataStream utilise des QVariant pour écrire les données de façon générique. Seuls les données ayant un QMetaType ID peuvent être convertis en QVariant. Pour que les types persos obtiennent un QMetaType ID, il faut utiliser les fonctions précédemment citées.

    Tout est écrit dans la doc de QMetaType...

    G.
    Un problème avec Qt ? Vous trouverez votre réponse ici : http://doc.trolltech.com/4.6/overviews.html
    En français (traduction réalisée par l'équipe Qt de DVP) : http://qt.developpez.com/doc/4.6/vues-d-ensemble/

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    Bonjour,

    En essayant ta méthode Gulish, qRegisterMetaType<T>() ou qRegisterMetaType<T>("T") ou qRegisterMetaTypeStreamOperators<T>("T"),
    je reçois une erreur à la ligne où se trouve cette méthode :

    " error: too few template-parameter-lists ".

    Savez vous d'où cela peut venir?
    Pourtant j'utilise bien comme dans la doc.

    Merci

  9. #9
    Membre actif Avatar de cayou66
    Inscrit en
    Décembre 2008
    Messages
    286
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Décembre 2008
    Messages : 286
    Points : 273
    Points
    273
    Par défaut
    Pourtant j'utilise bien comme dans la doc.
    Tu peux mettre le code que tu as mis exactement?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    qRegisterMetaType<MyClass>("MyClass"); // ????

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 25
    Points : 14
    Points
    14
    Par défaut
    J'utilise cette fonction
    oid qRegisterMetaTypeStreamOperators ( const char * typeName )

    Registers the stream operators for the type T called typeName.

    Afterward, the type can be streamed using QMetaType::load() and QMetaType::save(). These functions are used when streaming a QVariant.

    qRegisterMetaTypeStreamOperators<MyClass>("MyClass");

    The stream operators should have the following signatures:

    QDataStream &operator<<(QDataStream &out, const MyClass &myObj);
    QDataStream &operator>>(QDataStream &in, MyClass &myObj);

    Dans mon code, je prends cette fonction, je fait dans un .h que j'inclus à mon code où sera utilisé QDataStream
    Q_DECLARE_METATYPE(MyInput)
    qRegisterMetaTypeStreamOperators<MyInput>("MyInput");

    Q_DECLARE_METATYPE(MyInput) était deja utilisé et fonctionné très bien.

Discussions similaires

  1. Enregistrer un projet
    Par scoubi32006 dans le forum C++Builder
    Réponses: 5
    Dernier message: 17/06/2008, 16h06
  2. Réponses: 1
    Dernier message: 27/02/2008, 16h13
  3. Enregistrer un projet.
    Par PadawanDuDelphi dans le forum Delphi
    Réponses: 14
    Dernier message: 22/06/2007, 17h44
  4. enregistrer un projet
    Par ahmed2005 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 28/05/2007, 23h39

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