Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ajouter des données dans un QTreeWidget

Sujet résolu
    30 janvier 2024 à 13:02:19

    Bonjour,

    J'ai créer un QtreeWidget pour afficher les données d'une base de données. Je récupère bien toutes mes données dans une liste qui contient d'autres listes.

    output -> [["aaaa", "bbbb", "cccc"], ["dddd", "eeee", "ffff"], ["gggg", "hhhh", "iiii"]]


    La liste à lire est de ce type, dans l'exemple il y aura donc 3 lignes a ajouter dans le QtreeWidget, mais en réalité ce nombre doit etre variable. Par contre le nombre de colonne est toujours fixe. (Colonne 1, Colonne 2, Colonne 3)

    Est-ce que quelqu'un a une idée de comment faire cela ? 

    Merci.

    Apres remplissage ca devrait ressembler a cela.

    -
    Edité par Jobard91 30 janvier 2024 à 13:03:07

    • Partager sur Facebook
    • Partager sur Twitter
    La connaissance ne vaut que si elle est partagée.
      30 janvier 2024 à 15:37:18

      J'ai créer un QtreeWidget pour afficher les données d'une base de données. Je récupère bien toutes mes données dans une liste qui contient d'autres listes.

      Eh bien, vous devez savoir comment sont nommés chaque élément que vous ajouterez dans votre QTreeWidget ?

      Il suffit de créer chaque élément de votre QTreeWidget, de les ajouter à l'aide de la bonne méthode indiquée dans la documentation Qt à partir d'une boucle.

      Si vous utilisez Qt, c'est que vous maîtrisez le langage Python ! Pas besoin d'avoir un code exemple...

      • Partager sur Facebook
      • Partager sur Twitter

      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

        30 janvier 2024 à 18:54:33

        fred1599 a écrit:

        J'ai créer un QtreeWidget pour afficher les données d'une base de données. Je récupère bien toutes mes données dans une liste qui contient d'autres listes.

        Eh bien, vous devez savoir comment sont nommés chaque élément que vous ajouterez dans votre QTreeWidget ?

        Il suffit de créer chaque élément de votre QTreeWidget, de les ajouter à l'aide de la bonne méthode indiquée dans la documentation Qt à partir d'une boucle.

        Si vous utilisez Qt, c'est que vous maîtrisez le langage Python ! Pas besoin d'avoir un code exemple...


        Non je ne maitrise ni python ni qt, je travaille avec python depuis quelques moi seulement. Je n'ai pas trouvé la méthode a utiliser dans la doc qt d ou ma venue ici
        • Partager sur Facebook
        • Partager sur Twitter
        La connaissance ne vaut que si elle est partagée.
          30 janvier 2024 à 19:09:13

          Si vous ne maîtrisez pas python, il vous sera difficile de comprendre une documentation Qt plus touffue utilisant très généralement la programmation orientée objets.

          Commencez par créer un petit code fonctionnel avec votre liste de mots et un QTreeWidget vide...

          Après on pourra toujours y ajouter un complément pour vous aider.

          -
          Edité par fred1599 30 janvier 2024 à 19:09:47

          • Partager sur Facebook
          • Partager sur Twitter

          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

            30 janvier 2024 à 19:09:54

            Je me demande si le QTreeWidget est le mieux pour présenter des données, peut-être mieux un QTableView ou QTableWidget
            • Partager sur Facebook
            • Partager sur Twitter
              30 janvier 2024 à 19:11:47

              umfred a écrit:

              Je me demande si le QTreeWidget est le mieux pour présenter des données, peut-être mieux un QTableView ou QTableWidget


              C'est fort possible ! Mais le PO le verra sans doute lors de son test ;)
              • Partager sur Facebook
              • Partager sur Twitter

              Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
              La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                30 janvier 2024 à 19:56:00

                En fait j'avais commencé mon logiciel avec un QTableWidget et ca fonctionne, j'arrive a afficher toutes les données de ma bdd.

                Le soucis est que chaque cellule est éditable et je ne veux pas que ce soit éditable, et autre chose qui me plait pas avec le QTableWidget c'est que quand on clique sur une cellule ca ne sélectionne que la cellule, moi je voudrais que ca sélectionne la ligne entière.

                Ici mon tableWidget fonctionne mais je veux eviter de pouvoir selectionner une seule cellule a la fois et surtout que ce soit pas éditable, juste de la lecture.

                J'ai essayé de faire un : 

                tableWidget.setEnabled(True)

                Alors effectivement ca désactive la modification des cellules mais ca desactive aussi les scrollbar du bas et de droite, donc ca ne va pas...

                Y'a peut etre d'autres méthodes ?

                Pour remplir mon tableWidget je fais comme cela :

                ui.tableWidget.setRowCount(0)
                for row_number, row_data in enumerate(result):
                    tableWidget.insertRow(row_number)
                         for column_number, data in enumerate (row_data):
                             tableWidget.setItem(row_number, column_number, QTableWidgetItem(str(data)))

                EDIT:

                J'ai essayé de rajouter un flag pour bloquer l'édition des cellules mais ca ne fonctionne pas, mes cellules ne sont meme plus remplies avec les données.

                tableWidget.setItem(row_number, column_number, QTableWidgetItem(str(data)).setFlags(PySide6.QtCore.Qt.ItemIsEnabled)

                -
                Edité par Jobard91 2 février 2024 à 0:31:30

                • Partager sur Facebook
                • Partager sur Twitter
                La connaissance ne vaut que si elle est partagée.
                  30 janvier 2024 à 23:02:24

                  Salut,

                  J'utiliserai plutot :

                  .setFlags(PySide6.QtCore.Qt.ItemIsEditable)



                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 janvier 2024 à 23:14:00

                    Merci de ta réponse mais ca ne fonctionne pas, j'ai toujours le meme probléme que précédemment, a savoir les 2 lignes se creer dans le QTableWidget mais elles restent vide quand j'ajoute le .setFlags.

                    Alors que quand je ne met pas le .setFlages les lignes se remplissent bien...

                    conn = sqlite3.connect(self.path_bdd)
                            curseur = conn.cursor()
                            result = curseur.execute(f"SELECT * FROM {table}")
                            
                            ui.tableWidget.setRowCount(0)
                            for row_number, row_data in enumerate(result):
                                ui.tableWidget.insertRow(row_number)
                                for column_number, data in enumerate (row_data):
                                    ui.tableWidget.setItem(row_number, column_number, QTableWidgetItem(str(data)).setFlags(PySide6.QtCore.Qt.ItemIsEditable))



                    -
                    Edité par Jobard91 2 février 2024 à 0:31:19

                    • Partager sur Facebook
                    • Partager sur Twitter
                    La connaissance ne vaut que si elle est partagée.
                      31 janvier 2024 à 1:46:06

                      En fait je voyais plutot comme ceci (sans avoir testé):

                      for row_number, row_data in enumerate(result):
                                  ui.tableWidget.insertRow(row_number)
                                  for column_number, data in enumerate (row_data):
                                      item = QTableWidgetItem()
                                      item.setText(str(data))
                                      item.setFlags(PySide6.QtCore.Qt.ItemIsEditable)
                                      ui.tableWidget.setItem(row_number, column_number, item)

                      -
                      Edité par Garkam 31 janvier 2024 à 1:52:29

                      • Partager sur Facebook
                      • Partager sur Twitter
                        31 janvier 2024 à 12:06:57


                        Je suis tombé sur ce sujet https://forum.qt.io/topic/82749/how-to-make-qtablewidget-read-only/8

                        It is

                        pTableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)

                        Normally you can press enter or F2? or double click to start editing a cell. this will disable that.

                         liste des paramètres possibles https://doc.qt.io/qt-6/qabstractitemview.html#EditTrigger-enum 

                        • Partager sur Facebook
                        • Partager sur Twitter
                          31 janvier 2024 à 14:34:36

                          autre chose qui me plait pas avec le QTableWidget c'est que quand on clique sur une cellule ca ne sélectionne que la cellule, moi je voudrais que ca sélectionne la ligne entière

                          C'est le fonctionnement standard d'un tableur ! Pour sélectionner toute la ligne, vous pouvez garder le clic sur la cellule et sélectionner de gauche à droite les autres cellules.

                          Si maintenant vous retirez la sélection standard d'une cellule, et que pour je ne sais quelle raison, vous souhaitez avoir à nouveau ce mode de fonctionnement, vous risquez de casser tout votre code. Réfléchissez peut-être à un autre moyen de sélectionner toute une ligne ? D'ailleurs que se passe-t-il si je clique sur un numéro de ligne dans votre QTableWidget ?

                          Alors effectivement ca désactive la modification des cellules mais ca desactive aussi les scrollbar du bas et de droite, donc ca ne va pas...

                          Je ne vois pas trop le rapport entre une cellule éditable ou non, et les scrollbar, pouvez-vous écrire un code (voir deux codes) avec le cas où les cellules sont éditables et le cas où les cellules sont pas éditables afin de voir apparaître l'état des scrollbars ?

                          Je vous avais demandé un code testable, ce qui veut dire que quand je copie colle votre code dans mon IDE, ça s'exécute correctement... vous ne l'avez pas fait ! Difficile d'attendre par la suite, une réponse correcte, sachant que de notre côté nous ne pouvons pas testé... n'attendez pas non plus qu'on écrive des petits codes testables pour vérifier que ce que vous dîtes est vrai, à vous de le prouver.

                          Merci de ta réponse mais ca ne fonctionne pas, j'ai toujours le meme probléme que précédemment, a savoir les 2 lignes se creer dans le QTableWidget mais elles restent vide quand j'ajoute le .setFlags.

                          on peut voir le code testable et faire des tests de notre côté ?

                          EDIT : J'avais un peu de temps, j'ai testé QTableWidget et cette histoire de scrollbar quand on rend les cellules non éditables.

                          import sys
                          from PyQt6.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget
                          from PyQt6.QtCore import Qt
                          
                          class MainWindow(QMainWindow):
                              def __init__(self):
                                  super().__init__()
                          
                                  self.data = [["aaaa", "bbbb", "cccc"], ["dddd", "eeee", "ffff"], ["gggg", "hhhh", "iiii"]]
                          
                                  self.table = QTableWidget()
                          
                                  self.table.setRowCount(len(self.data))
                                  self.table.setColumnCount(len(self.data[0]))
                          
                                  for i, row in enumerate(self.data):
                                      for j, val in enumerate(row):
                                          item = QTableWidgetItem(val)
                                          # Rendre l'élément non éditable
                                          item.setFlags(item.flags() & ~Qt.ItemFlag.ItemIsEditable)
                                          self.table.setItem(i, j, item)
                          
                                  self.layout = QVBoxLayout()
                                  self.layout.addWidget(self.table)
                                  
                                  self.central_widget = QWidget()
                                  self.central_widget.setLayout(self.layout)
                                  self.setCentralWidget(self.central_widget)
                          
                                  self.setGeometry(300, 300, 300, 150)
                                  self.setWindowTitle('Tableau PyQt')
                          
                          if __name__ == '__main__':
                              app = QApplication(sys.argv)
                              mainWin = MainWindow()
                              mainWin.show()
                              sys.exit(app.exec())
                          

                          de mon côté je ne vois pas de différence sur l'état du scrollbar lorsque les cellules sont soit éditables soit non éditabes.

                          du coup je ne vois pas le problème !

                          P.S J'ai cliqué sur la cellule numérotée d'une ligne, et l'ensemble des colonnes de la ligne sont bien sélectionnées.

                          Je ne comprend pas la demande de cliquer sur une cellule pour sélectionner l'ensemble de la ligne...

                          Clic sur un numéro de ligne

                          -
                          Edité par fred1599 31 janvier 2024 à 19:05:40

                          • Partager sur Facebook
                          • Partager sur Twitter

                          Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                          La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                            1 février 2024 à 10:16:43

                            red1599 a écrit:

                            autre chose qui me plait pas avec le QTableWidget c'est que quand on clique sur une cellule ca ne sélectionne que la cellule, moi je voudrais que ca sélectionne la ligne entière

                            C'est le fonctionnement standard d'un tableur ! Pour sélectionner toute la ligne, vous pouvez garder le clic sur la cellule et sélectionner de gauche à droite les autres cellules.

                            Si maintenant vous retirez la sélection standard d'une cellule, et que pour je ne sais quelle raison, vous souhaitez avoir à nouveau ce mode de fonctionnement, vous risquez de casser tout votre code. Réfléchissez peut-être à un autre moyen de sélectionner toute une ligne ? D'ailleurs que se passe-t-il si je clique sur un numéro de ligne dans votre QTableWidget ?

                            Alors effectivement ca désactive la modification des cellules mais ca desactive aussi les scrollbar du bas et de droite, donc ca ne va pas...

                            Je ne vois pas trop le rapport entre une cellule éditable ou non, et les scrollbar, pouvez-vous écrire un code (voir deux codes) avec le cas où les cellules sont éditables et le cas où les cellules sont pas éditables afin de voir apparaître l'état des scrollbars ?

                            Je vous avais demandé un code testable, ce qui veut dire que quand je copie colle votre code dans mon IDE, ça s'exécute correctement... vous ne l'avez pas fait ! Difficile d'attendre par la suite, une réponse correcte, sachant que de notre côté nous ne pouvons pas testé... n'attendez pas non plus qu'on écrive des petits codes testables pour vérifier que ce que vous dîtes est vrai, à vous de le prouver.

                            Merci de ta réponse mais ca ne fonctionne pas, j'ai toujours le meme probléme que précédemment, a savoir les 2 lignes se creer dans le QTableWidget mais elles restent vide quand j'ajoute le .setFlags.

                            on peut voir le code testable et faire des tests de notre côté ?

                            EDIT : J'avais un peu de temps, j'ai testé QTableWidget et cette histoire de scrollbar quand on rend les cellules non éditables.

                            import sys
                            from PyQt6.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget
                            from PyQt6.QtCore import Qt
                            
                            class MainWindow(QMainWindow):
                                def __init__(self):
                                    super().__init__()
                            
                                    self.data = [["aaaa", "bbbb", "cccc"], ["dddd", "eeee", "ffff"], ["gggg", "hhhh", "iiii"]]
                            
                                    self.table = QTableWidget()
                            
                                    self.table.setRowCount(len(self.data))
                                    self.table.setColumnCount(len(self.data[0]))
                            
                                    for i, row in enumerate(self.data):
                                        for j, val in enumerate(row):
                                            item = QTableWidgetItem(val)
                                            # Rendre l'élément non éditable
                                            item.setFlags(item.flags() & ~Qt.ItemFlag.ItemIsEditable)
                                            self.table.setItem(i, j, item)
                            
                                    self.layout = QVBoxLayout()
                                    self.layout.addWidget(self.table)
                                    
                                    self.central_widget = QWidget()
                                    self.central_widget.setLayout(self.layout)
                                    self.setCentralWidget(self.central_widget)
                            
                                    self.setGeometry(300, 300, 300, 150)
                                    self.setWindowTitle('Tableau PyQt')
                            
                            if __name__ == '__main__':
                                app = QApplication(sys.argv)
                                mainWin = MainWindow()
                                mainWin.show()
                                sys.exit(app.exec())
                            

                            de mon côté je ne vois pas de différence sur l'état du scrollbar lorsque les cellules sont soit éditables soit non éditabes.

                            du coup je ne vois pas le problème !

                            P.S J'ai cliqué sur la cellule numérotée d'une ligne, et l'ensemble des colonnes de la ligne sont bien sélectionnées.

                            Je ne comprend pas la demande de cliquer sur une cellule pour sélectionner l'ensemble de la ligne...

                            Clic sur un numéro de ligne

                            -
                            Edité par fred1599 il y a environ 15 heures


                            Bonjour,

                            Quand j'essaye d'integrer l'exemple de code que tu ma fourni et t'en remercie j'ai une erreur à la ligne 14:

                            def remplir_tableView_scene_visualiser_equipements(self, path_bdd, table, ui):
                                    conn = sqlite3.connect(self.path_bdd)
                                    curseur = conn.cursor()
                                    result = curseur.execute(f"SELECT * FROM {table}")
                                    data = result.fetchall()
                                    
                                    ui.tableWidget_visualiser_equipements.setRowCount(len(data))
                                    ui.tableWidget_visualiser_equipements.setColumnCount(len(data[0]))
                             
                                    for i, row in enumerate(data):
                                        for j, val in enumerate(row):
                                            item = QTableWidgetItem(val)
                                            # Rendre l'élément non éditable
                                            item.setFlags(item.flags() & ~Qt.ItemFlag.ItemIsEditable)
                                            ui.tableWidget_visualiser_equipements.setItem(i, j, item)


                            Pour la désactivation des scrollbars ca me donnait ca :

                            Je ne pouvais plus accéder aux scrollbars ni même cliquer sur aucune cellule, mais en cherchant de plus près j'ai vu que c'était parce que j'avais appliqué le setEnabled(False) au tableWidget en général et pas uniquement aux cellules qui le compose.

                            Garkam a écrit:

                            En fait je voyais plutot comme ceci (sans avoir testé):

                            for row_number, row_data in enumerate(result):
                                        ui.tableWidget.insertRow(row_number)
                                        for column_number, data in enumerate (row_data):
                                            item = QTableWidgetItem()
                                            item.setText(str(data))
                                            item.setFlags(PySide6.QtCore.Qt.ItemIsEditable)
                                            ui.tableWidget.setItem(row_number, column_number, item)

                            -
                            Edité par Garkam hier à 1:52


                            Merci de ton aide ca fonctionne aussi effectivement de cette maniere

                            -
                            Edité par Jobard91 2 février 2024 à 0:31:02

                            • Partager sur Facebook
                            • Partager sur Twitter
                            La connaissance ne vaut que si elle est partagée.
                              1 février 2024 à 10:45:53

                              Bonjour,

                              Vous utilisez quelle version de PyQt ?

                              Encore une fois votre code n'est pas testable en l'état, le mien fonctionne si vous utilisez PyQt6...

                              EDIT : Si vous utilisez PyQt5, modifiez item.setFlags(item.flags() & ~Qt.ItemFlag.ItemIsEditable) par item.setFlags(item.flags() & ~Qt.ItemIsEditable) 

                              -
                              Edité par fred1599 1 février 2024 à 10:55:11

                              • Partager sur Facebook
                              • Partager sur Twitter

                              Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                              La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                1 février 2024 à 12:14:59

                                C'est compliqué de vous faire un code qui s'exécute en reprenant mon code, tout est dans des fichiers séparés et il y a près de 10 000lignes de code pour le moment, c'est pour cela que je donne juste la fonction en question. Et de plus l'interface graphique a été faite avec QtDesigner.

                                Quand j'intègre ma base de données dans ton programme ca fonctionne bien:

                                import sys
                                from PyQt6.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QVBoxLayout, QWidget
                                from PyQt6.QtCore import Qt
                                import sqlite3
                                 
                                class MainWindow(QMainWindow):
                                    def __init__(self):
                                        super().__init__()
                                
                                        table = "main"
                                        conn = sqlite3.connect(r"C:\Users\********.db")
                                        curseur = conn.cursor()
                                        result = curseur.execute(f"SELECT * FROM {table}")
                                        self.data = result.fetchall()
                                 
                                        self.table = QTableWidget()
                                 
                                        self.table.setRowCount(len(self.data))
                                        self.table.setColumnCount(len(self.data[0]))
                                 
                                        for i, row in enumerate(self.data):
                                            for j, val in enumerate(row):
                                                item = QTableWidgetItem(val)
                                                # Rendre l'élément non éditable
                                                item.setFlags(item.flags() & ~Qt.ItemFlag.ItemIsEditable)
                                                self.table.setItem(i, j, item)
                                 
                                        self.layout = QVBoxLayout()
                                        self.layout.addWidget(self.table)
                                         
                                        self.central_widget = QWidget()
                                        self.central_widget.setLayout(self.layout)
                                        self.setCentralWidget(self.central_widget)
                                 
                                        self.setGeometry(300, 300, 300, 150)
                                        self.setWindowTitle('Tableau PyQt')
                                 
                                if __name__ == '__main__':
                                    app = QApplication(sys.argv)
                                    mainWin = MainWindow()
                                    mainWin.show()
                                    sys.exit(app.exec())


                                Mais quand j'intègre dans mon code source ca ne fonctionne plus, ca met met bien toutes les lignes, mais elles sont vides et toujours editables:

                                def remplir_tableView(self, path_bdd, table, ui):
                                        table = "main"
                                        conn = sqlite3.connect(r"C:\Users\*****.db")
                                        curseur = conn.cursor()
                                        result = curseur.execute(f"SELECT * FROM {table}")
                                        self.data = result.fetchall()
                                 
                                        self.table = ui.tableWidget
                                 
                                        self.table.setRowCount(len(self.data))
                                        self.table.setColumnCount(len(self.data[0]))
                                 
                                        for i, row in enumerate(self.data):
                                            for j, val in enumerate(row):
                                                item = QTableWidgetItem(val)
                                                # Rendre l'élément non éditable
                                                item.setFlags(item.flags() & ~Qt.ItemFlag.ItemIsEditable)
                                                self.table.setItem(i, j, item)



                                Quand je commente la ligne 17 le tableau est bien rempli et ca fonctionne (avec cellules éditables bien sûr.)

                                Et je suis sur PyQt6 aussi.

                                Merci de ton aide

                                -
                                Edité par Jobard91 2 février 2024 à 0:29:48

                                • Partager sur Facebook
                                • Partager sur Twitter
                                La connaissance ne vaut que si elle est partagée.
                                  1 février 2024 à 12:41:56

                                  teste en remplaçant cette ligne par cette décomposition:

                                  flags = item.flags()
                                  flags = flags & ~Qt.ItemFlag.ItemIsEditable
                                  item.setFlags(flags)



                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    1 février 2024 à 12:43:12

                                    à mon avis l'erreur est là : self.table = ui.tableWidget_visualiser_equipements faîtes un print(self.table) et un print(self.data) pour vérifier que vous recevez bien les résultats attendus.
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                      1 février 2024 à 15:17:37

                                      umfred a écrit:

                                      teste en remplaçant cette ligne par cette décomposition:

                                      flags = item.flags()
                                      flags = flags & ~Qt.ItemFlag.ItemIsEditable
                                      item.setFlags(flags)

                                      J'ai essayé de décomposer et ca fait le meme résultat, par contre si je commente la ligne 2 la tableau se rempli.

                                      fred1599 a écrit:

                                      à mon avis l'erreur est là : self.table = ui.tableWidget_visualiser_equipements faîtes un print(self.table) et un print(self.data) pour vérifier que vous recevez bien les résultats attendus.


                                      J'ai enleve les données de ma base de données pour essayer avec juste une liste qui contient 3 autres listes et ca fait toujours le meme resultat. Sans la fameuse ligne le tableWidget se rempli, et avec la ligne il ne se rempli plus et me renvoie une erreur comme ci dessous.

                                      def remplir_tableView_scene_visualiser_equipements(self, path_bdd, table, ui):        
                                              self.data = [["aaaa", "bbbb", "cccc"], ["dddd", "eeee", "ffff"], ["gggg", "hhhh", "iiii"]]
                                       
                                              self.table = ui.tableWidget_visualiser_equipements
                                       
                                              self.table.setRowCount(len(self.data))
                                              self.table.setColumnCount(len(self.data[0]))
                                       
                                              for i, row in enumerate(self.data):
                                                  for j, val in enumerate(row):
                                                      item = QTableWidgetItem(val)
                                                      # Rendre l'élément non éditable
                                                      # item.setFlags(item.flags() & ~Qt.ItemFlag.ItemIsEditable)
                                                      self.table.setItem(i, j, item)
                                              
                                              print(f"self.table: {self.table}")
                                              print(f"self.data: {self.data}")

                                      Le resultat des print :

                                      Et l'erreur si je décommente la ligne :

                                      Merci a vous

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      La connaissance ne vaut que si elle est partagée.
                                        1 février 2024 à 16:17:43

                                        Chez moi ça fonctionne, et comme je peux pas reproduire, soit vous créer un code permettant de tester et reproduire chez moi, soit je ne peux pas vous aider
                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                        La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                          1 février 2024 à 16:54:32

                                          Etonnant que l'exemple que donne @fred1599 ici fonctionne et qu'une fois les éléments insérés dans ton script, ça ne marche plus !!!

                                          C'est que le problème est ailleurs...

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            1 février 2024 à 17:16:23

                                            Garkam a écrit:

                                            Etonnant que l'exemple que donne @fred1599 ici fonctionne et qu'une fois les éléments insérés dans ton script, ça ne marche plus !!!

                                            C'est que le problème est ailleurs...


                                            Oui et j'en suis certains, cependant on ne sait pas ce qui se passe après dans son code, donc aucune reproduction possible pour vérifier cette erreur.
                                            • Partager sur Facebook
                                            • Partager sur Twitter

                                            Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                            La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                              1 février 2024 à 17:31:59

                                              Question bête :

                                              Est-ce que Qt est bien importé ??

                                              from PyQt6.QtCore import Qt
                                              
                                              ...
                                              
                                              item.setFlags(item.flags() & ~Qt.ItemFlag.ItemIsEditable)
                                              
                                              # ou
                                              
                                              import PyQt6
                                              
                                              ...
                                              
                                              item.setFlags(item.flags() & ~PyQt6.QtCore.Qt.ItemFlag.ItemIsEditable)

                                              Edit : Et si tu remplaces & par |

                                              item.setFlags(item.flags() | ~Qt.ItemFlag.ItemIsEditable)





                                              -
                                              Edité par Garkam 1 février 2024 à 17:43:35

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                1 février 2024 à 19:59:09

                                                Bonsoir,

                                                Alors j'ai refais un programme qui reproduis le fonctionnement de mon logiciel et ou on peut voir le problème.

                                                Il faut creer 3 fichiers dans le meme dossier qui vont s'appeler :

                                                ui_mainwindow.py                 (C'est ce fichier qui contient toute l'interface graphique généré avec QtDesigner)

                                                gestion_tableWidget.py          (C'est dans ce fichier qu'il y la méthode pour remplir le tableWidget)

                                                start_window_gui.py              (C'est ce fichier qui gère le déroulement du programme)

                                                Pour lancer le programme il faut exécuter le fichier start_window_gui.py

                                                Le code actuel fonctionne, pour voir apparaitre le problème il faut juste décommenter la ligne 22 du fichiergestion_tableWidget.py

                                                Merci pour votre aide.

                                                start_window_gui.py :

                                                import sys
                                                from PySide6.QtWidgets import QApplication, QMainWindow, QWidget
                                                from ui_mainwindow import Ui_MainWindow
                                                from gestion_tableWidget import Gestion_tableWidget
                                                
                                                class MainWindow(QMainWindow):
                                                    ui = ""
                                                    
                                                    def __init__(self):
                                                        super(MainWindow, self).__init__()
                                                        self.ui = Ui_MainWindow()
                                                        self.ui.setupUi(self)
                                                    
                                                        self.ui.stackedWidget.setCurrentWidget(self.ui.scene_home)
                                                        self.controlleur_boutons()
                                                        
                                                
                                                    def controlleur_boutons(self):
                                                        self.ui.btn_test_tableWidget.clicked.connect(self.gestion_btn_scene_tableWidget)
                                                        Gestion_tableWidget().remplir_tableWidget(self.ui)
                                                    
                                                    def gestion_btn_scene_tableWidget(self):
                                                        self.ui.stackedWidget.setCurrentWidget(self.ui.scene_tableWidget)
                                                        
                                                if __name__ == "__main__":
                                                    app = QApplication(sys.argv)
                                                    app.setStyle('Fusion')
                                                
                                                    window = MainWindow()
                                                    window.show()
                                                
                                                    sys.exit(app.exec())


                                                gestion_tableWidget.py :

                                                from PySide6.QtWidgets import QTableWidgetItem
                                                import PySide6.QtCore
                                                from PyQt6.QtCore import Qt
                                                
                                                class Gestion_tableWidget():
                                                    
                                                    def __init__(self):
                                                        print("Constructeur OK")
                                                
                                                    def remplir_tableWidget(self, ui):        
                                                        self.data = [["aaaa", "bbbb", "cccc"], ["dddd", "eeee", "ffff"], ["gggg", "hhhh", "iiii"]]
                                                 
                                                        self.table = ui.tableWidget
                                                 
                                                        self.table.setRowCount(len(self.data))
                                                        self.table.setColumnCount(len(self.data[0]))
                                                 
                                                        for i, row in enumerate(self.data):
                                                            for j, val in enumerate(row):
                                                                item = QTableWidgetItem(val)
                                                                # Rendre l'élément non éditable
                                                                # item.setFlags(item.flags() & ~Qt.ItemFlag.ItemIsEditable)
                                                                self.table.setItem(i, j, item)


                                                ui_mainwindow.py :

                                                from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
                                                    QMetaObject, QObject, QPoint, QRect,
                                                    QSize, QTime, QUrl, Qt)
                                                from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
                                                    QFont, QFontDatabase, QGradient, QIcon,
                                                    QImage, QKeySequence, QLinearGradient, QPainter,
                                                    QPalette, QPixmap, QRadialGradient, QTransform)
                                                from PySide6.QtWidgets import (QApplication, QHBoxLayout, QHeaderView, QLabel,
                                                    QMainWindow, QPushButton, QSizePolicy, QStackedWidget,
                                                    QTableWidget, QTableWidgetItem, QWidget)
                                                
                                                class Ui_MainWindow(object):
                                                    def setupUi(self, MainWindow):
                                                        if not MainWindow.objectName():
                                                            MainWindow.setObjectName(u"MainWindow")
                                                        MainWindow.setEnabled(True)
                                                        MainWindow.resize(1366, 768)
                                                        sizePolicy = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
                                                        sizePolicy.setHorizontalStretch(0)
                                                        sizePolicy.setVerticalStretch(0)
                                                        sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
                                                        MainWindow.setSizePolicy(sizePolicy)
                                                        MainWindow.setMinimumSize(QSize(1366, 768))
                                                        MainWindow.setMaximumSize(QSize(1366, 768))
                                                        MainWindow.setMouseTracking(False)
                                                        MainWindow.setAutoFillBackground(False)
                                                        MainWindow.setStyleSheet(u"background-color:rgb(165, 191, 218)")
                                                        MainWindow.setToolButtonStyle(Qt.ToolButtonIconOnly)
                                                        MainWindow.setDockNestingEnabled(False)
                                                        MainWindow.setUnifiedTitleAndToolBarOnMac(False)
                                                        self.centralwidget = QWidget(MainWindow)
                                                        self.centralwidget.setObjectName(u"centralwidget")
                                                        self.horizontalLayoutWidget = QWidget(self.centralwidget)
                                                        self.horizontalLayoutWidget.setObjectName(u"horizontalLayoutWidget")
                                                        self.horizontalLayoutWidget.setGeometry(QRect(9, 9, 1351, 90))
                                                        self.horizontalLayout = QHBoxLayout(self.horizontalLayoutWidget)
                                                        self.horizontalLayout.setObjectName(u"horizontalLayout")
                                                        self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
                                                        self.btn_test_tableWidget = QPushButton(self.horizontalLayoutWidget)
                                                        self.btn_test_tableWidget.setObjectName(u"btn_test_tableWidget")
                                                
                                                        self.horizontalLayout.addWidget(self.btn_test_tableWidget)
                                                
                                                        self.stackedWidget = QStackedWidget(self.centralwidget)
                                                        self.stackedWidget.setObjectName(u"stackedWidget")
                                                        self.stackedWidget.setGeometry(QRect(29, 129, 1311, 611))
                                                        self.scene_home = QWidget()
                                                        self.scene_home.setObjectName(u"scene_home")
                                                        self.label = QLabel(self.scene_home)
                                                        self.label.setObjectName(u"label")
                                                        self.label.setGeometry(QRect(580, 250, 49, 16))
                                                        self.stackedWidget.addWidget(self.scene_home)
                                                        self.scene_tableWidget = QWidget()
                                                        self.scene_tableWidget.setObjectName(u"scene_tableWidget")
                                                        self.tableWidget = QTableWidget(self.scene_tableWidget)
                                                        self.tableWidget.setObjectName(u"tableWidget")
                                                        self.tableWidget.setGeometry(QRect(75, 11, 1161, 581))
                                                        self.tableWidget.setStyleSheet(u"background-color: white")
                                                        self.stackedWidget.addWidget(self.scene_tableWidget)
                                                        MainWindow.setCentralWidget(self.centralwidget)
                                                
                                                        self.retranslateUi(MainWindow)
                                                
                                                        self.stackedWidget.setCurrentIndex(1)
                                                
                                                
                                                        QMetaObject.connectSlotsByName(MainWindow)
                                                    # setupUi
                                                
                                                    def retranslateUi(self, MainWindow):
                                                        MainWindow.setWindowTitle("")
                                                        self.btn_test_tableWidget.setText(QCoreApplication.translate("MainWindow", u"Test tableWidget", None))
                                                        self.stackedWidget.setWindowTitle("")
                                                        self.label.setText(QCoreApplication.translate("MainWindow", u"Home", None))
                                                    # retranslateUi



                                                Garkam a écrit:

                                                Question bête :

                                                Est-ce que Qt est bien importé ??

                                                from PyQt6.QtCore import Qt
                                                
                                                ...
                                                
                                                item.setFlags(item.flags() & ~Qt.ItemFlag.ItemIsEditable)
                                                
                                                # ou
                                                
                                                import PyQt6
                                                
                                                ...
                                                
                                                item.setFlags(item.flags() & ~PyQt6.QtCore.Qt.ItemFlag.ItemIsEditable)

                                                Edit : Et si tu remplaces & par |

                                                item.setFlags(item.flags() | ~Qt.ItemFlag.ItemIsEditable)





                                                -
                                                Edité par Garkam il y a environ 1 heure


                                                Oui Garkam les imports sont fait et j'ai aussi essayé de changé le caractère & par | et ca me fait toujours le même problème.

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                La connaissance ne vaut que si elle est partagée.
                                                  1 février 2024 à 20:24:35

                                                  C'est PySide6 ou PyQt6 ?
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter

                                                  Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                                  La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                                    1 février 2024 à 20:35:31

                                                    C'est PySide6
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    La connaissance ne vaut que si elle est partagée.
                                                      1 février 2024 à 20:38:42

                                                      Bah utilise déjà PySide6 à la place de PyQt6 dans ton code
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                                      La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                                        1 février 2024 à 23:11:29

                                                        Merci ca fonctionne, j'ai pas fais attention c'est de ma faute, j'ai mélangé des imports pyside et pyqt

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        La connaissance ne vaut que si elle est partagée.
                                                          1 février 2024 à 23:15:03

                                                          fred1599 a écrit:

                                                          Bah utilise déjà PySide6 à la place de PyQt6 dans ton code

                                                          Ah bah c'est sur :lol: je suis même étonné que ça n'ai pas fait planter Python 



                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            1 février 2024 à 23:30:04

                                                            Jobard91 a écrit:

                                                            Merci ca fonctionne, j'ai pas fais attention c'est de ma faute, j'ai mélangé des imports pyside et pyqt

                                                            Bonjour,

                                                            Sujet résolu

                                                            Tu peux passer le sujet à "résolu" (bouton en haut à droite du sujet) et cliquer sur les pouces levés des messages qui t'ont aidé⋅e ;)

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              1 février 2024 à 23:43:04

                                                              @Garkam,

                                                              Oui je ne comprend pas non plus, rien que par rapport à la boucle événementielle, mais comme ce ne sont que des Enums, ça devait passer.

                                                              -
                                                              Edité par fred1599 1 février 2024 à 23:44:02

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
                                                              La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

                                                              Ajouter des données dans un QTreeWidget

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              • Editeur
                                                              • Markdown