Partage
  • Partager sur Facebook
  • Partager sur Twitter

MVC (enfin... plutôt MV) avec Qt et c++

    6 octobre 2018 à 20:59:54

    Bonjour à tous,

    Je découvre avec grand intérêt le pattern MVC, et j'aimerais essayer de le mettre en pratique avec un petit logiciel de gestion des auditions à destination d'une école de musique.

    Les données seraient structurées de la façon suivante, et stockées dans un fichier xml :

    <?xml version="1.0" encoding="UTF-8"?>
    <audition>
        <date>17/10/2018</date>
        <heure>18:30</heure>
        <lieu>Salle 3</lieu>
        <morceau>
            <titre>Sonate n°1</titre>
            <compositeur>W.A. Mozart</compositeur>
            <arrangeur>Bibi</arrangeur>
            <duree>2:30</duree>
            <chaises>0</chaises>
            <pupitres>1</pupitres>
            <eleve>
                <prenom>Jean</prenom>
                <nom>Dupont</nom>
                <instrument>Piano</instrument>
            </eleve>
        </morceau>
        <morceau>
            <titre>Duo n°1</titre>
            <compositeur>Joseph Küffner</compositeur>
            <duree>1:15</duree>
            <chaises>2</chaises>
            <pupitres>1</pupitres>
            <eleve>
                <prenom>Rémi</prenom>
                <nom>Fassol</nom>
                <instrument>Clarinette</instrument>
            </eleve>
            <eleve>
                <prenom>Ella</prenom>
                <nom>Sidot</nom>
                <instrument>Clarinette</instrument>
            </eleve>
        </morceau>
    </audition>

    Récupérer ces données à partir du fichier xml ne me pose pas de problème, mais je me demande quel est le modèle le plus approprié à mon cas concret. L'idée étant de pouvoir afficher dans des QLabel les infos générales de l'audition (date, heure et lieu) et dans un QTableView la liste des morceaux avec toutes leurs caractéristiques.

    Ca serait simple si je n'avais pas pour chaque morceau la sous-liste d'élèves. Mais c'est là que je bloque : peut-on imaginer d'avoir dans le modèle contenant les morceaux sous forme de table une sorte de sous-modèle qui contiendrait pour chaque morceau les élèves concernés sous forme de liste ?

    Si je pense des objets Morceau et Eleve, il m'est facile de concevoir l'objet Eleve ayant comme attributs le nom, le prénom et l'instrument, et l'objet Morceau ayant comme attributs le titre, le compositeur, etc. et un vector<Eleve> ou une liste d'Eleve. Mais passer au niveau "modèle" n'est pas encore évident pour moi...

    Je pense qu'il faut que je résolve d'abord la question de la structure du modèle. Pour la vue, je souhaiterais que la liste des élèves de chaque morceau apparaisse soit sous la forme d'une QString "Rémi Fassol (clarinette), Ella Sidot (clarinette)" ou d'une liste qui occuperait une case de la table.

    J'espère avoir été clair et que vous aurez des conseils pour que je puisse me lancer. Merci d'avance !

    • Partager sur Facebook
    • Partager sur Twitter
      9 octobre 2018 à 14:19:43

      Bonjour,

      je te suggère ceci comme modélisation des données:

      • Partager sur Facebook
      • Partager sur Twitter
        11 octobre 2018 à 9:14:08

        Bonjour,

        Merci pour ta réponse !

        J'étais effectivement arrivé à cette structure de données, mais je me demandais si c'était facilement utilisable dans un pattern model/view. Ma question est donc : comment déclarer cette structure de données comme modèle ? Est-il obligatoire de passer par des objets de type QStandardItemModel ? Comment faire le lien avec la vue (qui sera essentiellement une TableView) ?

        J'aurais d'autres manipulations à faire sur les données, comme par exemple générer la liste du matériel nécessaire (chaises, pupitres), ou la liste des élèves concernés par l'audition, contrôler le minutage total ou encore générer automatiquement le programme de l'audition (j'imagine la génération d'un fichier LaTeX). Il me semble que toutes ces manipulations peuvent se faire directement sur les données, ça n'aurait donc pas d'incidence sur le model/view.

        • Partager sur Facebook
        • Partager sur Twitter
          11 octobre 2018 à 14:51:24

          Gui Yom a écrit:

          Bonjour

          Coucou

          Je ne suis pas très Qt donc à boire avec modération :

          Gui Yom a écrit:

          J'étais effectivement arrivé à cette structure de données, mais je me demandais si c'était facilement utilisable dans un pattern model/view.

          De jugeote je dirais : Pourquoi pas ? Les données, c'est toi qui fait joujou avec avant de les organiser dans ton modèle, non ?

          Gui Yom a écrit:

          Est-il obligatoire de passer par des objets de type QStandardItemModel ? Comment faire le lien avec la vue (qui sera essentiellement une TableView) ?

          Pour ce qui est de faire le lien avec ta vue... Tu peux simplement assigner un model à ta table view : tableView->setModel(model);

          Aussi, d'après Developpez.com (source que tu peux vérifier assez aisément sur la doc Qt également) :

          Tous les modèles fournis par Qt sont basés sur la classe QAbstractItemModel. Cette classe est la plus abstraite et la plus haute dans la hiérarchie des classes des différents modèles. Cette classe fournit une interface que tous les modèles doivent respecter, afin d'être utilisés correctement avec une vue.

          De base, Qt fournit un ensemble de modèles pouvant être directement utilisés comme :
          • QStringListModel : stockage d'une liste de QString ;
          • QFileSystemModel : un ensemble d'informations sur un fichier ou un répertoire du système de fichier local (anciennement QDirModel) ;
          • QStandardItemModel : gestion de tout type de structure, complexe ou non ;
          • QSqlTableModel, QSqlRelationalTableModel : accès à une base de données (SQLite, MySQL...).

          Cependant, il arrive parfois (voire souvent) que ces modèles ne conviennent pas à l'utilisation et que l'on souhaite créer ses propres modèles. Pour cela, rien de réellement complexe. Il suffit en effet de créer une classe dérivant d'une des classes suivantes :

          • QAbstractItemModel : comme évoqué plus haut, il s'agit de la classe la plus abstraite ;
          • QAbstractListModel : classe abstraite fournissant une interface pour un modèle de type liste (associé à une QListView) ;
          • QAbstractTableModel : classe abstraite fournissant une interface pour un modèle de type tableau (associé à une QTableView).

          Conclusion : Tu peux très bien faire ton propre... modèle de model ? :lol:

          Gui Yom a écrit:

          J'aurais d'autres manipulations à faire sur les données, comme par exemple générer la liste du matériel nécessaire (chaises, pupitres), ou la liste des élèves concernés par l'audition, contrôler le minutage total ou encore générer automatiquement le programme de l'audition (j'imagine la génération d'un fichier LaTeX). Il me semble que toutes ces manipulations peuvent se faire directement sur les données, ça n'aurait donc pas d'incidence sur le model/view.

          Oui. Ce sera plus des boutons "Export" qui vont s'occuper de récupérer les données et les mettre au format que tu définiras Ataguiz.

          Ta tableView est juste là pour afficher les données. Après, libre à toi de laisser la possibilité à l'utilisateur de modifier ces données via la-dite view. Là, faudra jouer avec les delegates il me semble.




          -
          Edité par LilyKianii 11 octobre 2018 à 14:56:58

          • Partager sur Facebook
          • Partager sur Twitter
            14 octobre 2018 à 10:00:47

            Merci pour ta réponse !

            En fait, cette discussion me permet de mieux voir ce que j'ai encore du mal à appréhender (normal quand on débute !) : c'est la façon de faire le lien entre mes données, que j'ai réussi à organiser avec les objets comme proposé par bxdfr dans son diagramme, et le modèle.

            Une fois que mon modèle sera en place, j'ai bien conscience que le plus dur du boulot sera fait, puisque l'assigner à la vue est effectivement très simple !

            • Partager sur Facebook
            • Partager sur Twitter

            MVC (enfin... plutôt MV) avec Qt et c++

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown