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 :

comment supprimer un élément dans un arbre QTreeView


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 comment supprimer un élément dans un arbre QTreeView
    Bonjour,
    Je souhaite supprimer un élément dans un arbre QTreeView.
    J'ai pensé utiliser removeRow mais ça affiche une erreur :
    AttributeError: 'QTreeView' object has no attribute 'removeRow'

    Voici un morceau de 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
     
     
    REMOVEFN = os.path.join(os.path.dirname(__file__), "delete.jpg")
     
    class FenPrincipale(QMainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
            model = QStandardItemModel()
            item1=QStandardItem("John")
            item2=QStandardItem("Paul")
            item3=QStandardItem("Vincent")
            model.appendRow(item1)
            model.appendRow(item2)
            model.appendRow(item3)
            item1.appendRow(QStandardItem("17 ans"))
            self.vue = QTreeView(self)
            self.vue.setModel(model)
            layout = QVBoxLayout()
            layout.addWidget(self.vue)
            self.setLayout(layout)
     
            exitAct = QAction(QIcon(REMOVEFN), 'remove', self)
            exitAct.triggered.connect(self.deletetreerow)        
            self.toolbar = self.addToolBar('Exit')
            self.toolbar.addAction(exitAct)
     
            w=QWidget()
            w.setLayout(layout)
            self.setCentralWidget(w)
     
        def deletetreerow(self):   
            index=self.vue.selectionModel().currentIndex()
            self.vue.removeRow(index)
    Merci d'avance pour votre aide

  2. #2
    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,

    Puisque QTreeView n'affiche des données que par l'intermédiaire d'un modèle, il faut supprimer les données avec le modèle.

    Voir ici pour la doc du modèle utilisé: https://doc.qt.io/qt-5/qstandarditemmodel.html

  3. #3
    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,
    Merci pour cette information.
    Malgré plusieurs essais, je ne trouve toujours pas le bon code pour supprimer un élément dans l'arbre QTreeView par exemple "paul".
    Quel code peut-on utiliser pour supprimer cet élément dans l'arbre QTreeView?
    Merci d'avance pour votre aide

  4. #4
    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,

    La manipulation d'un arbre n'a jamais été facile...

    Je suggère de regarder les exemples de PyQt5 du site riverbank. Ces exemples ne viennent pas (et c'est dommage) avec l'installation de PyQt5 par "pip", il faut les télécharger avec les sources ici: https://www.riverbankcomputing.com/s...pyqt/download5. Puis, désarchiver le fichier compressé.

    Un exemple de suppression (entre autres) d'un item de QTreeView avec son modèle se trouve dans le répertoire "examples\itemviews\editabletreemodel"

    Pour tester: exécuter le programme "editabletreemodel.py", sélectionner une ligne et demander sa suppression avec le menu "action". Puis, examiner le code et pister ce qui se passe après la méthode lancée par le menu.

    Je n'en sais pas plus.

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,
    Citation Envoyé par kloram Voir le message
    J'ai pensé utiliser removeRow mais ça affiche une erreur :
    AttributeError: 'QTreeView' object has no attribute 'removeRow'

    Voici un morceau de code en pyqt5 :
    Ce morceau de code n'est pas suffisant pour qu'on puisse tester et reproduire l'erreur...
    Cela ne facilite pas les choses pour aider...

  6. #6
    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,

    Voici le code
    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
     
     
    import sys, os
    from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QTreeView, QMainWindow, qApp, QAction, QPushButton
    from PyQt5.QtGui import QStandardItemModel, QStandardItem, QIcon
    REMOVEFN = os.path.join(os.path.dirname(__file__), "delete.jpg")
     
    class FenPrincipale(QMainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
            model = QStandardItemModel()
            item1=QStandardItem("John")
            item2=QStandardItem("Paul")
            item3=QStandardItem("Vincent")
            model.appendRow(item1)
            model.appendRow(item2)
            model.appendRow(item3)
            item1.appendRow(QStandardItem("17 ans"))
            self.vue = QTreeView(self)
            self.vue.setModel(model)
            layout = QVBoxLayout()
            layout.addWidget(self.vue)
            self.setLayout(layout)
     
    # création d'une barre de menu
            actExit = QAction('Exit', self)        
            actExit.triggered.connect(qApp.quit)
            menubar = self.menuBar()
            fileMenu = menubar.addMenu('File')
            fileMenu.addAction(actExit)
     
    # créer un icône dans la barre d'outils
            exitAct = QAction(QIcon(REMOVEFN), 'remove', self)
            exitAct.triggered.connect(self.deletetreerow)        
            self.toolbar = self.addToolBar('Exit')
            self.toolbar.addAction(exitAct)
     
    # ajouter une fenêtre
            w=QWidget()
            w.setLayout(layout)
            self.setCentralWidget(w)
     
    # fonction pour supprimer un élément dans l'arbre
        def deletetreerow(self):   
            row= self.vue.model
            row.removeRow(row)
     
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        window = FenPrincipale()
        window.show()
        sys.exit(app.exec_())
    Merci d'avance pour votre aide

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    J'ai modifiè la fonction deletetreerow pour qu'elle supprime l'item sélectionné lors du clique sur l’icône "remove"...
    Cela fonctionne bien pour les sous items mais les autres disparaissent sans être vraiment supprimés... Pour ces derniers j'ai utilisé la fonction takeItem car la fonction removeRow ne passait pas... C'est pour cela que ça marche moins bien...

    Comme l'a dit tyrtamos ce n'est pas facile et on trouve peu d'explication...
    Code python : 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
     
     
    import sys
    import os
    from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QTreeView, QMainWindow, qApp, QAction, QPushButton
    from PyQt5.QtGui import QStandardItemModel, QStandardItem, QIcon
    REMOVEFN = os.path.join(os.path.dirname(__file__), "delete.jpg")
     
     
    class FenPrincipale(QMainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
            self.model = QStandardItemModel()
            item1 = QStandardItem("John")
            item2 = QStandardItem("Paul")
            item3 = QStandardItem("Vincent")
            self.model.appendRow(item1)
            self.model.appendRow(item2)
            self.model.appendRow(item3)
            item1.appendRow(QStandardItem("17 ans"))
            self.vue = QTreeView(self)
            self.vue.setModel(self.model)
            layout = QVBoxLayout()
            layout.addWidget(self.vue)
            self.setLayout(layout)
     
    # création d'une barre de menu
            actExit = QAction('Exit', self)
            actExit.triggered.connect(qApp.quit)
            menubar = self.menuBar()
            fileMenu = menubar.addMenu('File')
            fileMenu.addAction(actExit)
     
    # créer un icône dans la barre d'outils
            exitAct = QAction(QIcon(REMOVEFN), 'remove', self)
            exitAct.triggered.connect(self.deletetreerow)
            self.toolbar = self.addToolBar('Exit')
            self.toolbar.addAction(exitAct)
     
    # ajouter une fenêtre
            w = QWidget()
            w.setLayout(layout)
            self.setCentralWidget(w)
     
    # fonction pour supprimer un élément dans l'arbre
        def deletetreerow(self):
            items = self.vue.selectedIndexes()
            if len(items) == 0:
                print('aucun item sélectionné')
                return
            item = self.model.itemFromIndex(items[0])
     
            if item.parent() == None:            
                self.model.takeItem(item.row())
            else:            
                item.parent().removeRow(item.row())
     
     
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        window = FenPrincipale()
        window.show()
        sys.exit(app.exec_())

    Une idée pour dépanner serait d'ajouter un niveau supérieurs "Personnes" :


    Code python : 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
     
     
    import sys
    import os
    from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QTreeView, QMainWindow, qApp, QAction, QPushButton
    from PyQt5.QtGui import QStandardItemModel, QStandardItem, QIcon
    REMOVEFN = os.path.join(os.path.dirname(__file__), "delete.jpg")
     
     
    class FenPrincipale(QMainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
            self.model = QStandardItemModel()
            personnes = QStandardItem("Personnes")
     
            item1 = QStandardItem("John")
            item1.appendRow(QStandardItem("17 ans"))
            item2 = QStandardItem("Paul")
            item3 = QStandardItem("Vincent")
     
            personnes.appendRow(item1)
            personnes.appendRow(item2)
            personnes.appendRow(item3)
            self.model.appendRow(personnes)   
     
     
            self.vue = QTreeView(self)
            self.vue.setModel(self.model)
            layout = QVBoxLayout()
            layout.addWidget(self.vue)
            self.setLayout(layout)
     
    # création d'une barre de menu
            actExit = QAction('Exit', self)
            actExit.triggered.connect(qApp.quit)
            menubar = self.menuBar()
            fileMenu = menubar.addMenu('File')
            fileMenu.addAction(actExit)
     
    # créer un icône dans la barre d'outils
            exitAct = QAction(QIcon(REMOVEFN), 'remove', self)
            exitAct.triggered.connect(self.deletetreerow)
            self.toolbar = self.addToolBar('Exit')
            self.toolbar.addAction(exitAct)
     
    # ajouter une fenêtre
            w = QWidget()
            w.setLayout(layout)
            self.setCentralWidget(w)
     
    # fonction pour supprimer un élément dans l'arbre
        def deletetreerow(self):
            items = self.vue.selectedIndexes()
            if len(items) == 0:
                print('auncun item sélèctionné')
                return
            item = self.model.itemFromIndex(items[0])
     
            if item.parent() != None:                          
                item.parent().removeRow(item.row())
     
     
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        window = FenPrincipale()
        window.show()
        sys.exit(app.exec_())

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    Finalement j'ai trouvé comment faire pour supprimer n'importe quel item (même les top level item) :
    La fonction deletetreerow supprime l'item sélectionné lors du clique sur l’icône "remove"...

    Code python : 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
     
     
    import sys, os
    from PyQt5.QtWidgets import QWidget, QApplication, QVBoxLayout, QTreeView, QMainWindow, qApp, QAction, QPushButton
    from PyQt5.QtGui import QStandardItemModel, QStandardItem, QIcon
    REMOVEFN = os.path.join(os.path.dirname(__file__), "delete.jpg")
     
    class FenPrincipale(QMainWindow):
        def __init__(self, parent=None):
            super().__init__(parent)
            self.model = QStandardItemModel()
            item1=QStandardItem("John")
            item2=QStandardItem("Paul")
            item3=QStandardItem("Vincent")
            self.model.appendRow(item1)
            self.model.appendRow(item2)
            self.model.appendRow(item3)
            item1.appendRow(QStandardItem("17 ans"))
            self.vue = QTreeView(self)
            self.vue.setModel(self.model)
            layout = QVBoxLayout()
            layout.addWidget(self.vue)
            self.setLayout(layout)
     
    # création d'une barre de menu
            actExit = QAction('Exit', self)        
            actExit.triggered.connect(qApp.quit)
            menubar = self.menuBar()
            fileMenu = menubar.addMenu('File')
            fileMenu.addAction(actExit)
     
    # créer un icône dans la barre d'outils
            exitAct = QAction(QIcon(REMOVEFN), 'remove', self)
            exitAct.triggered.connect(self.deletetreerow)        
            self.toolbar = self.addToolBar('Exit')
            self.toolbar.addAction(exitAct)
     
    # ajouter une fenêtre
            w=QWidget()
            w.setLayout(layout)
            self.setCentralWidget(w)
     
    # fonction pour supprimer un élément dans l'arbre
        def deletetreerow(self):   
            items = self.vue.selectedIndexes()
            if len(items) == 0:
                print('auncun item sélèctionné')
                return
            # item = self.model.itemFromIndex(items[0])        
            self.model.removeRow(items[0].row(), items[0].parent())
     
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        window = FenPrincipale()
        window.show()
        sys.exit(app.exec_())

  9. #9
    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
    Merci beaucoup pour vos aides

Discussions similaires

  1. Déplacement d'un élément dans un arbre intervallaire
    Par Larson dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 17/09/2008, 15h57
  2. Réponses: 2
    Dernier message: 27/09/2005, 17h26
  3. Supprimer des éléments dans une TreeView ?
    Par souch dans le forum Composants VCL
    Réponses: 4
    Dernier message: 16/09/2005, 12h20
  4. [TTreeview] Comment sélectionner un élément de l'arbre ?
    Par altahir007 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 14/04/2005, 13h44
  5. [C#] Comment supprimer une ligne dans DataGrid ?
    Par BAUDIER dans le forum ASP.NET
    Réponses: 2
    Dernier message: 20/07/2004, 16h03

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