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

PyQt Python Discussion :

Architecture d'une application QML


Sujet :

PyQt Python

  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 156
    Points : 218
    Points
    218
    Par défaut Architecture d'une application QML
    Bonjour,

    Actuellement je développe principalement avec PyQt et QWidget, pour le lancement d'un nouveau projet j'aimerai passer sur du QML. J'ai fait quelques POC j'en suis plutôt satisfait pour une petite application, mais maintenance je me lance dans la conception d'une appli un peu plus grosse, mais j'ai du mal a voir comment gérer ça. J'ai peur de me retrouver avec une méga classe de 3000 lignes. Avez-vous des exemples d'application avec plusieurs fenêtre ou un logique métier un peu moins basique que les exemples de Qt ? Suivez-vous une logique ?

    Actuellement je dev en MVC / HMVC avec QWidget et aimerai partir sur le ViewModel

    Merci de vos réponses

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par IPreferCSharp Voir le message
    J'ai peur de me retrouver avec une méga classe de 3000 lignes. Avez-vous des exemples d'application avec plusieurs fenêtre ou un logique métier un peu moins basique que les exemples de QT ? Suivez-vous une logique ?
    Toutes les applications avec un GUI explosent rapidement côté méthodes et objets.
    Je ne vois pas ce que QML a de spécifique.
    Comment découper son code pour pouvoir le construire et le tester par "petits bouts" que l'on pourra intégrer ensuite est un sujet de conception. Python vous apporte des briques de bases côté classes/modules/packages mais côté "design", c'est plutôt du côté des rubriques ALM qu'il va falloir chercher (et travailler).

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 156
    Points : 218
    Points
    218
    Par défaut
    Bonjour,

    Merci de ta réponse.

    En fait ce que QML a de spécifique c'est son architecture View/Model, jusqu'ici, si j'ai du code métier complexe, je découpe mon MVC en HMVC ( Hierarchical mvc ) et du coup je me retrouve pas avec une classe mainController de 3000 lignes mais plutôt 10 classes de 100 lignes.

    Dans le même esprit pour des applications WPF MVVM j'ai une classe VueModele par vue ou composant suivant la complexité.

    En fait je crois que je ne comprend pas le Model/View de Qt ou en tout cas comment découper mes applications. je m'explique

    J'ai une appli genre SPA ( Single Page Application ) que j'ai développé en QWidget, mon architecture ressemble a ça :

    Nom : file0000001.png
Affichages : 629
Taille : 7,1 Ko

    J'ai donc plusieurs vue, et un contrôleur pour chacune d'entre elles.

    Maintenant j’essaie de refaire cette appli en QML :
    Nom : QMLArchi.png
Affichages : 618
Taille : 6,4 Ko

    Mon Launcher :
    Donc la je créer un application QML, et lui passe le fichier .qml charger.
    Ensuite, j'instancie un objet de type ViewModelDispatch qui dans l'idée, va distribuer certains composant nécessitant une grosse logique métier vers des ViewModel différents.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        engine = QQmlApplicationEngine()
        # Création d'un objet QQmlContext pour communiquer avec le code QML
        ctx = engine.rootContext()
        engine.load('QML/Projet_Loader.qml')
        win = engine.rootObjects()[0]
        py_mainapp = ViewModelDispatch(ctx, win)
        ctx.setContextProperty("ViewModelDispatch", py_mainapp)
        win.show()
        sys.exit(app.exec())
    Ici le ViewModelDispatch crée les ViewModel et leur affecte des objects QML à gérer

    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
    class ViewModelDispatch(QObject):
     
        def __init__(self, context, parent=None):
            super(ViewModelDispatch, self).__init__(parent)
            self.win = parent
            self.ctx = context
     
            self.main_window_view_model = None
            self.left_panel_view_model = None
     
            self.dispatch()
     
     
        def dispatch(self):
            self.main_window_view_model = MainWindowViewModel(self.win, self.ctx)
    #Et la enfin mon ViewModel qui devrai normalement mettre à jours les modèles ... mais qui ne marche pas encore
    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
    class LeftPanelViewModel:
     
        def __init__(self, parent, context):
            self.win = parent
            self.ctx = context
            self.btnAddPatient = None
            self.connect()
     
        def testconnect(self):
            print(self.win.findChild(QObject, "buttonAddPatientobj"))
            t = self.win.findChildren(QObject)
            for item in t:
                print(item.objectName())
            self.win.findChild(QObject, "buttonAddPatientobj").messageRequired.connect(self.test_click)
            print("leftpanel connected")
     
        def connect(self):
        	self.btnAddPatient = self.win.findChild(QObject, "buttonAddPatientobj")
        	self.btnAddPatient.clicked.connect(self.test_click)
     
        def test_click(self):
            print("testclick")
    Je fait fausse route ? Je pense avoir loupé un truc mais je vois pas trop comment architecturer mon application avec ce ViewModel.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par IPreferCSharp Voir le message
    Je fait fausse route ? Je pense avoir loupé un truc mais je vois pas trop comment architecturer mon application avec ce ViewModel.
    Si vous essayez de plaquez l'architecture microsoft dite WPF MVVM, vous allez y perdre votre latin.
    D'abord, il faut s'appliquer à utiliser le jargon QtQuick/QML décrit ici. Piocher quelques idées dans de nouvelles architectures telles que celle-ci... voir comment appliquer çà à QML...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Rédacteur/Modérateur

    Avatar de Jiyuu
    Homme Profil pro
    Développeur amateur
    Inscrit en
    Janvier 2007
    Messages
    2 456
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur amateur
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 2 456
    Points : 6 789
    Points
    6 789
    Billets dans le blog
    15
    Par défaut


    Au risque d'être totalement à coté de la plaque : pourquoi ne pas essayer de faire plus de chose en "pur" QML ? Ok là ton exemple est très simpliste, et ma réponse l'est tout autant : mais appuyer sur un bouton, capter le fait que l'on ai appuyer dessus et faire une action : QML c'est très bien le faire.
    Initiation à Qt Quick et QML : Partie 1 - Partie 2
    En cas de besoin, pensez à la
    Mon site et mes tutoriaux sur Developpez.com
    Pas de question technique par MP... Les forums sont là pour ça

  6. #6
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 156
    Points : 218
    Points
    218
    Par défaut
    Salut,

    Merci de vos réponses.



    Jiyuu : Je pense déporter un maximum de traitement ( Input et comportement de la GUI ) dans le code QML/JS, cependant j'ai besoin d’accéder a des API python pour certain traitement, ce soft nécessite un accès au port séries, au système de fichier du pc ... et des traitements plutôt lourds

    wiztricks : J’essaie de me rattacher a ce que j'ai déjà fait, mais effectivement je me rend bien compte que cette approche n'est pas la bonne. Du coup j'ai regardé sur github des projets QML en cpp et/ou python pour voir un peu comment ils organisent ça. Tes liens sur les Action-Dispatcher sont très intéressant et QuickFlux a l'air plutôt cool, malheureusement si je l'utilise en python je n'ai pas accès au code Cpp ou alors je doit le binder ou le recoder :/
    Pour le moment je vais partir sur une architecture classique pour me faire la main. sur ces modèles la :
    https://github.com/team-phoenix/Phoenix
    https://github.com/hovo1990/PyQt5-QML-HUD-Test
    https://github.com/Zonzely/myMarkdow.../model/main.py

    Si vous avez des ressources sur des bonnes pratiques ou des petits framework utilisable en PyQt ou simplement QML je suis preneur.

    Merci de votre aide

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/08/2012, 08h53
  2. Architecture d'une Application 5250 ET Web
    Par SyrioDev dans le forum AS/400
    Réponses: 2
    Dernier message: 21/06/2009, 16h57
  3. Architecture d'une application
    Par *alexandre* dans le forum JSF
    Réponses: 2
    Dernier message: 02/05/2009, 21h41
  4. Architecture d'une application lourde multi utilisateur
    Par remieve dans le forum Débuter avec Java
    Réponses: 0
    Dernier message: 25/02/2009, 15h22
  5. Architecture d'une application Web
    Par le Daoud dans le forum Développement Web en Java
    Réponses: 7
    Dernier message: 05/10/2006, 11h39

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