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 :

Ajouter dans un QVBoxLayout une QTableView dont les données proviennent d'un fichier


Sujet :

PyQt Python

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2015
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2015
    Messages : 40
    Points : 56
    Points
    56
    Par défaut Ajouter dans un QVBoxLayout une QTableView dont les données proviennent d'un fichier
    Bonjour,

    Je souhaite ajouté à mon VBoxLayout une QTable view qui contiendra les données suivantes:

    Dans la première colonnes (Capacités): des simples Labels, dans les 5 colonnes suivantes, des radiobox, dans la dernière un bouton d'aide.

    Ce qui donnerait un formulaire selon le schémas suivant:

    "est capable de... :" | [x] aucune | [ ] faible | [ ] modérée | [ ] forte | [ ] totale | [bouton_daide_ouverture_popup]

    Mes labels sont triés dans un fichier XML sous la forme:

    <ID>1</ID>
    <capacite>est capable de... :</capacite>
    <aide_pour_la_popup>
    ....</aide_pour_la_popup>
    <...>...</...>

    Mes problèmes sont:

    - créer le QTableView, je vois beaucoup de doc pour le C++, très peu pour le python (du moins, très peu que je comprenne)
    - Lier mon fichier XML
    - Lier pour chaque label le formulaire de radiobox

    Pour l'heure, je n'ai que mon code de fenêtre de base, à savoir:

    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
     
    # -*- coding: utf-8 -*-
    #!/usr/bin/python3
     
    import sys
    try:
        from PyQt5.QtWidgets import QWidget,QMainWindow, QAction, qApp,\
        QApplication, QFrame, QVBoxLayout
        from PyQt5.QtGui import QIcon
    except ImportError:
        raise "Erreur lors de l'importation de PyQt5"
     
     
    class SetupUI(QMainWindow):
        def __init__(self):
            super(SetupUI, self).__init__()
     
            self.initUI()
     
        def initUI(self):
            self.setupCGToolBar()
            self.setCentralWidget(QFrame())
            self.vbox = QVBoxLayout()		
            self.vbox.addStretch(1)
     
            self.centralWidget().setLayout(self.vbox)
            self.setGeometry(300, 300, 300, 220)
            self.setWindowTitle("Formulaire ICF")
     
            self.show()
     
        # ToolBar	
        def setupCGToolBar(self):
            cg = self.addToolBar('CG')
            cg.addAction('Conditions générales d\'utilisations')
        def showCG(self):
            QMessageBox.question(self, 'Message', 'Show my message', QMessageBox.Yes)
        # /Toolbar
     
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        ex = SetupUI()
        sys.exit(app.exec_())
    Si vous pourriez m'aider dans la conception/ajout de ce QTableView, ce serait vraiment super.

    EDIT: si il y a plus simple qu'un QTableView pour ça, je suis bien entendu preneur !

    Meilleures salutations

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Citation Envoyé par cryptelyos Voir le message
    EDIT: si il y a plus simple qu'un QTableView pour ça, je suis bien entendu preneur !
    Ce qui est prévu me semble en même temps techniquement possible et épouvantablement compliqué.

    En effet, tous les objets graphiques qui s'appellent "Q....View" sont construits pour établir une relation automatique avec les données grâce à un "modèle". Il existe des modèles prédéfinis comme avec les bases de données ou les listes de chaines qui rendent la programmation assez simple et très élégante. Mais quand le modèle n'existe pas, il faut le créer de toute pièce en sous-classant une classe abstraite comme QAbstractItemModel. De plus, s'il faut mettre des widgets spécifiques dans certaines colonnes, il faut en plus sous-classer un "delegate".

    Et je ne connais pas de modèle tout fait pour un QTableView et un fichier XML (mais je ne connais pas tout: peut-être ça existe?). D'ailleurs, l'objet qui serait plus homogène avec un fichier XML serait plutôt un QTreeView à cause de la structure arborescente.

    Bref, je pencherais plutôt pour un QTableWidget. Au moins, on peut piloter plus facilement les lignes, colonnes et cases du tableau graphique. On peut créer des widgets différents dans chaque case, et ensuite créer les fonctions qui remplissent ("peuplent") la grille avec les données du fichier XML, et si nécessaire, qui enregistrent la grille modifiée dans le fichier XML. Il faudra, bien sûr, pouvoir "parser" le fichier XML pour en extraire les données, et le reconstruire en cas de modification.

    Autre solution: un QTreeWidget si la structure arborescente du XML devait se compliquer un peu.

    Mais bien sûr, ma réponse dépend en grande partie du choix de la structure des données sous forme XML. Si ces même données étaient sous forme de base de données ou de liste de listes, les solutions seraient peut-être différentes.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2015
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Juillet 2015
    Messages : 40
    Points : 56
    Points
    56
    Par défaut
    Bonjour,

    En soi, je ne suis pas limité sur la programmation et les technologies utilisés. après mon document comporte deux sections distingue:

    1 - un titre et une petite description
    2 - Un titre, une description plus complète, et une description pour les limites 1,3,5 (aucune, modérée, totale)

    Le logiciel sera installé sur plusieurs postes. Est-ce vraiment bien de créer une base de donnée pour chaque ? ou créer un mini-serveur "dédié" qu'à ça, me semble compliqué. Il y a de forte chance que ce petit logiciel deviennent multi-langue...donc je ne veux pas créer en "dur" les textes. Par ailleurs, ça incluerait de devoir créer 16 popups pour afficher les détails (partie 2 ci-dessus) donc un peu contre productif je pense - ou, je les enregistre le tout dans un .txt (partie 2), et quand je clic en dur, selon un ID donnée je lis "simplement" le "ID.txt" ?

    C'est égal pour moi, qu'elle serait la meilleure solution du coup ?

    Meilleure salutations

  4. #4
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Là, tu élargies sacrément ton problème, et malgré cela, je n'ai pas assez d'infos pour te renseigner.

    Imaginons par exemple:
    - le logiciel est multi-poste.
    - les données peuvent être modifiées par chaque poste mais n'ont pas à être portées à la connaissance des autres postes
    - chaque poste peut apporter d'autres modifications à tout instant qui ne concerne que ce poste
    - aucune surveillance ne demande d'obtenir en central les données de chaque poste.
    - tous les postes sont dans le même réseau

    Dans ce cas, on peut faire ça:
    - il existe un fichier de base de données sqlite "par défaut" téléchargeable au sein du réseau par chaque poste (pas besoin de serveur: il suffit d'un partage de fichiers netbios-samba)
    - ce fichier est recopié à l'installation au sein de chaque poste dans le home de l'utilisateur (créer un sous-répertoire au sein du répertoire utilisateur: os.path.expanduser("~"))
    - un QTableView avec un modèle de base de données sqlite permet de mettre à jour les données de la base de données locale
    - à l'ouverture du logiciel, une fonction permet de récupérer les données à jour par extraction de la base de données locale.

    l'avantage de sqlite est qu'il s'agit d'une bonne gestion de base de données relationnelle sans serveur (ni accès concurrents!). Par ailleurs, il y a un pilote livré avec Python ainsi qu'avec PyQt.

    Mais, bien sûr, si les données modifiées par chaque poste devaient servir aussi aux autres postes, il faudrait revenir à la solution serveur + une base de données de type postgresql: ça change la dimension et la complexité du projet, mais c'est la seule solution qui prend en charge le fait que plusieurs postes peuvent vouloir changer la base de données en même temps!

    Tu vois qu'il ne faut pas changer grand chose au projet pour changer les solutions! Un bon cahier des charges devrait permettre de faire les meilleurs choix.

    Pour que le logiciel soit multilingue: PyQt5 sait faire ça => voir comment dans la doc.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

Discussions similaires

  1. Réponses: 12
    Dernier message: 23/04/2009, 14h32
  2. Réponses: 7
    Dernier message: 05/09/2008, 12h07
  3. Réponses: 2
    Dernier message: 04/03/2008, 12h32
  4. Réponses: 19
    Dernier message: 04/06/2007, 18h12
  5. Réponses: 12
    Dernier message: 05/10/2006, 16h00

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