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 :

affichage des éléments à partir d'un élément parmi la liste


Sujet :

PyQt Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 15
    Par défaut affichage des éléments à partir d'un élément parmi la liste
    Bonjour,
    Je souhaite faire un code qui contient 2 colonnes dans la fenêtre en langage pyqt5.
    La 1ère colonne contient une liste de catégories (par exemple : voiture contenant des différentes modèles).
    Dès qu'on sélectionne une catégorie parmi la liste (par exemple : Ferrari), dans la colonne 2, on affiche les caractéristiques de cette catégorie (par exemple : type de moteur de la voiture, dimension de la voiture, nombre de portes, ....) à l'aide d'un tableau QTableWidget par exemple.
    Pourriez-vous m'aider comment réaliser ce code ou me donner des exemples pour m'aider ?
    Merci d'avance pour vos réponses

  2. #2
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2020
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2020
    Messages : 15
    Par défaut
    Bonjour,
    suite à mon précédent message, en cherchant, je pense qu'il faut utiliser QStackedWidget.
    Voici le code en pyqt5

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
    import sys, os
    from PyQt5.QtWidgets import QWidget, QApplication, QHBoxLayout, QTreeView, QMainWindow, QTableWidget, QAction, qApp, QSplitter
    from PyQt5.QtGui import QStandardItemModel, QStandardItem
    from PyQt5.QtCore import Qt
     
    class FenPrincipale(QMainWindow):
        def __init__(self, parent=None):
            super(FenPrincipale).__init__(parent)  
     
    # création d'un arbre
            self.model = QStandardItemModel()
            item1=QStandardItem("Peugeot")
            item2=QStandardItem("Citroen")
            item3=QStandardItem("Renault")
            self.model.appendRow(item1)
            self.model.appendRow(item2)
            self.model.appendRow(item3)
            self.view = QTreeView(self)
            self.view.setModel(self.model)
     
    # création d'un affichage d'une fenêtre d'un élément parmi la liste
            self.stack1 = QWidget()
            self.stack2 = QWidget()
            self.stack3 = QWidget()
     
            self.stack1UI()
            self.stack2UI()
            self.stack3UI()
     
            self.Stack = QStackedWidget(self)
            self.Stack.addWidget(self.stack1)
            self.Stack.addWidget(self.stack2)
            self.Stack.addWidget(self.stack3) 
     
    # positionner des éléments dans une fenêtre  
            layout = QHBoxLayout(self)
            layout.addWidget(self.view)
            layout.addWidget(self.Stack)   
            self.setLayout(layout)
            self.Stack.currentRowChanged.connect(self.display)
     
    # création d'une fenêtre 1              
        def stack1UI(self):
            widget = QFormLayout()
            widget.addRow("modèle=x",QLineEdit())
            widget.addRow("moteur=y",QLineEdit())
            widget.addRow("nombre de porte=z",QLineEdit())
            self.stack1.setLayout(widget)
     
    # création d'une fenêtre 2
        def stack1UI(self):
            widget = QFormLayout()
            widget.addRow("modèle=x",QLineEdit())
            widget.addRow("moteur=y",QLineEdit())
            widget.addRow("nombre de porte=z",QLineEdit())
            self.stack2.setLayout(widget)
     
    # création d'une fenêtre 3
        def stack1UI(self):
            widget = QFormLayout()
            widget.addRow("modèle=x",QLineEdit())
            widget.addRow("moteur=y",QLineEdit())
            widget.addRow("nombre de porte=z",QLineEdit())
            self.stack3.setLayout(widget)
     
    # affichage de la fenêtre après avoir cliqué un élément dans l'arbre de liste  
        def display(self,i):
            self.Stack.setCurrentIndex(i)
     
     
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        window = FenPrincipale()
        window.show()
        sys.exit(app.exec_())
    Ce code ne marche pas.
    Merci d'avance pour votre aide

  3. #3
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    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 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    D'après ce que j'ai compris, voilà une solution minimale en tant que source d'inspiration:

    - un QTableWidget à 2 colonnes:
    => colonne 0: les marques,
    => colonne 1: les caractéristiques de la marque sélectionnée dans la colonne 0

    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
     
    import sys
    from PyQt5 import (QtWidgets, QtGui, QtCore)
     
    #############################################################################
    class Fenetre(QtWidgets.QWidget):
     
        # =======================================================================
        def __init__(self, datas={}, parent=None):
            super().__init__(parent)
     
            self.resize(800, 600)
     
            # dictionnaire des données
            self.datas = datas
     
            # crée le QTableWidget
            self.tableWidget = QtWidgets.QTableWidget(self)
            self.nbrow, self.nbcol = 10, 2
            self.tableWidget.setRowCount(self.nbrow)
            self.tableWidget.setColumnCount(self.nbcol)
     
            # sélection réduite à une seule cellule à la fois
            self.tableWidget.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection)
     
            # chaque nouvelle sélection exécutera la méthode signalée
            self.tableWidget.itemSelectionChanged.connect(self.selectitem)
     
            # met des QTableWidgetItem dans toutes les cases
            for row in range(0, self.tableWidget.rowCount()):
                for col in range(0, self.tableWidget.columnCount()):
                    qitem = QtWidgets.QTableWidgetItem("")
                    self.tableWidget.setItem(row, col, qitem)
     
            # met les marques dans la colonne 0
            col = 0
            for row, marque in enumerate(self.datas):
                self.tableWidget.item(row, col).setText(marque)
     
            # place le QTableWidget dans la fenêtre
            posit = QtWidgets.QGridLayout()
            posit.addWidget(self.tableWidget, 0, 0)
            self.setLayout(posit)
     
            # initialise la sélection de la 1ère cellule [0, 0]
            self.tableWidget.setFocus()
            self.tableWidget.setCurrentCell(0, 0)
     
        # =======================================================================
        def selectitem(self):
            """exécuté à chaque sélection d'une cellule
            """
            qitem =  self.tableWidget.selectedItems()[0]
            if qitem.column()==0:
                # la sélection est dans la colonne 0
                if qitem.text() in self.datas:
                    # liste des caractéristiques
                    caracts = self.datas[qitem.text()] 
                    # affiche les caractéristiques dans la colonne 1
                    col = 1
                    # vide la colonne 1
                    for row in range(0, self.tableWidget.rowCount()):
                        self.tableWidget.item(row, col).setText("")
                    # met les caractéristiques voulues dans la colonne 1
                    for row in range(0, len(caracts)):
                        self.tableWidget.item(row, col).setText(caracts[row])
                else:
                    # on a sélectionné une cellule vide => vide la colonne 1
                    col = 1
                    for row in range(0, self.tableWidget.rowCount()):
                        self.tableWidget.item(row, col).setText("")
     
     
    #############################################################################
    if __name__ == "__main__":
        app = QtWidgets.QApplication(sys.argv)
     
        datas = {"Peugeot":["caract11", "caract12", "caract13", "caract14", "caract15", "caract16", "caract17", "caract18", "caract19"], 
                     "Renault":["caract21", "caract22", "caract23", "caract24", "caract25", "caract26", "caract27", "caract28", "caract29"],
                     "Ferrari":["caract31", "caract32", "caract33", "caract34", "caract35", "caract36", "caract37", "caract38", "caract39"]}
     
        fen = Fenetre(datas)
        fen.show()
        sys.exit(app.exec_())
    Après, il faut ajouter ce qui manque si on veut modifier les données (modifier les marques, en ajouter, en supprimer, et idem pour les caractéristiques).

    Peut-être faut-il utiliser pour les données plutôt un "collections.OrderedDict" pour conserver l'ordre des marques.

    On devrait pouvoir faire ça aussi avec un QTreeWidget.

Discussions similaires

  1. Affichage des éléments d'une liste chainée
    Par Panda98 dans le forum Débuter
    Réponses: 4
    Dernier message: 27/05/2018, 10h05
  2. Réponses: 0
    Dernier message: 13/12/2010, 09h34
  3. affichage des éléments d'une liste
    Par ajor dans le forum Servlets/JSP
    Réponses: 0
    Dernier message: 30/07/2009, 12h55
  4. affichage des éléments d'une liste horizontalement
    Par progamer54 dans le forum JSF
    Réponses: 7
    Dernier message: 16/04/2007, 10h34
  5. Eviter l'affichage des éléments d'une liste déroulante
    Par auriolbeach dans le forum Access
    Réponses: 1
    Dernier message: 28/02/2006, 07h50

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