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

QxOrm Discussion :

Classe persistante et mapping QWidget (modèle/vue)


Sujet :

QxOrm

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations forums :
    Inscription : Août 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut Classe persistante et mapping QWidget (modèle/vue)
    Bonjour,

    Quelqu'un a-t'il déjà eu besoin de "mapper" l'instance d'une classe persistante (le modèle) à des QWidgets dans un formulaire simple (la vue) avec mise à jour du modèle automatique ? D'après vous quel est le moyen le plus efficace d'y parvenir ?

    • Connection Signaux / slots...
    • QDataWidgetMapper et QAbstractItemModel...
    • Utiliser les délégués.

    Merci.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut


    avec mise à jour du modèle automatique ?
    J'avoue que je ne suis pas très fan de ce concept de mise à jour automatique dès que l'IHM est modifiée (ou inversement).
    J'ai travaillé pendant 1 an et demi avec ce concept sur WPF, et ça ne m'a pas du tout convaincu.
    Je préfère le classique Fill() / File() :
    - 1 méthode Fill() pour alimenter ton IHM à partir du modèle ;
    - 1 méthode File() pour alimenter ton modèle à partir de l'IHM.
    Par exemple, tu appelles Fill() au chargement de ton formulaire, et ton File() lorsque l'utilisateur appuie sur un bouton "Enregistrer" ou autre...

    Après, je crois que QML propose l'équivalent de WPF pour mapper ton modèle à ton IHM : il suffit que dans tes classes persistantes, tu déclares tes propriétés avec la macro Q_PROPERTY() (équivalent au INotifyPropertyChanged du WPF).

    Je suis curieux d'avoir l'avis d'autres personnes sur ce sujet, c'est intéressant...
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations forums :
    Inscription : Août 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut


    J'entends par "mise à jour auto" lorsque le focus quitte le QWidget, alors le modèle est mis à jour avec la valeur saisie, ensuite, effectivement, un bouton permet de persister le modèle, ou d'annuler les modifs (grace à qx::dao::ptr (qui stoque la valeur originale))

    Ainsi, lorsqu'on saisit une valeur dans un QWidget, la valeur peut être vérifiée par QxValidator, et une "tooltip" peut indiquer le message retourné par le validateur, le background du QWidget change si invalide, la police du QWidget change si la valeur du modèle "isDirty", etc... Cela permet pas mal de possibilités.

    Je pense utiliser QDataWidgetMapper. Je posterai un bout de code quand j'aurai testé.

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations forums :
    Inscription : Août 2011
    Messages : 26
    Points : 14
    Points
    14
    Par défaut
    Finalement, c'est assez simple d'implémenter le pattern Vue / Modèle à l'aide des classes QWidgetDataMapper, QAbstractItemModel, et QStyledItemDelegate.
    Il me reste à implémenter la hiérarchie dans le modèle afin de gérer les relations entre les classes persistantes, avant de poster un bout de code.

    Mais en implémentant mes délégués, il me vient une question : Avec les QxValidators, il est possible de tester la validité d'une classe complète, mais je n'ai pas trouvé la possibilité de tester la validité d'une propriété uniquement.

    Dans mon idée des validators, il serait intéressant de les implémenter au niveau des propriétés, du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    t.id(& person::_id, "id");
    IxDataMember * pData = t.data(& person::_firstName, "firstName");
    pData->add_NotEmpty("a person must have a firstName");
    par conséquent, la classe peut quand même vérifier sa validité en testant tous les validators de toutes ses propriétés, et on pourrait tester la validité sur une propriété avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    IxDatamember * d = qxDatamemberX->get_WithDaoStrategy("firstName");
    bool ok = d->isValid(personValidate);
    // ou :
    qx::validate(personValidate, "firstName");
    Qu'en pense QxOrm ?

    [EDIT :]
    Ceci dans le but de permettre à la vue d'attirer l'attention de l'utilisateur sur le Widget dont la valeur du modèle serait invalide.
    [re EDIT]
    oups ! J'avais pas saisi la notion de groupe des validators...
    Oubliez l'idée ci dessus.

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    481
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 481
    Points : 4 238
    Points
    4 238
    Par défaut
    Mais en implémentant mes délégués, il me vient une question : Avec les QxValidators, il est possible de tester la validité d'une classe complète, mais je n'ai pas trouvé la possibilité de tester la validité d'une propriété uniquement.
    Quand tu valides une instance de classe, la fonction qx::validate te retourne une liste de valeurs invalides. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    qx::QxInvalidValueX invalidValues = qx::validate(myObject);
    La classe qx::QxInvalidValueX contient une liste d'éléments de type qx::QxInvalidValue.
    Et pour chaque qx::QxInvalidValue, tu as la propriété en erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    qx::QxInvalidValue invalidValue;
    QString sProperty = invalidValue.getPropertyName();
    Tu peux ainsi cibler le QWidget qui correspond à la propriété en erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    avant de poster un bout de code...
    Il me tarde de voir à quoi ressemble ton code
    Le site de la bibliothèque QxOrm : bibliothèque C++ de gestion de données (Mapping Objet Relationnel ou ORM) basée sur les frameworks Qt et boost.
    QxEntityEditor : éditeur graphique pour la bibliothèque QxOrm (application multi-plateforme pour gérer graphiquement le modèle d'entités).

    Tutoriel : installer un environnement de développement avec QxOrm sous Windows.
    Tutoriel qxBlog : gestion de blogs en C++/Qt.
    Tutoriel qxClientServer : création d'un serveur d'applications en C++/Qt.

Discussions similaires

  1. Réponses: 14
    Dernier message: 21/12/2014, 23h20
  2. Réponses: 13
    Dernier message: 21/12/2014, 22h42
  3. Champ de texte et MVC (modèle vue contrôleur)
    Par three minute hero dans le forum Windows
    Réponses: 1
    Dernier message: 22/02/2007, 11h04
  4. Classes persistantes et session
    Par bendf82 dans le forum Hibernate
    Réponses: 3
    Dernier message: 11/12/2006, 10h59
  5. [JSP][Servlet][Javabean] Modèle Vue Controleur
    Par ay_pepito dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 04/02/2004, 10h05

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