Search code examples
pythonpysidedisplayqtablewidget

How to refresh display of a QTableWidget when a new row is added


I'm trying to refresh my table display when I want to add a new row. The rows of the table are added but on the display there is no change.

I don't know how to update the display so that the line I just added is visible on the window.

I guess that when adding a line you have to call back the display function, but what I tried doesn't work. Maybe we have to add the Widget again to the layout of the tab but in this case I want to help a little because I don't know how to do it.

Constructor :

def __init__(self, parent=None):

          super(MainUI, self).__init__(parent)
          # onglet "Dépenses"
          self.tabDepense = QWidget()
          # onglet "Budgets"
          self.tabBudgets = QWidget()
          # onglet "Bilan"
          self.tabBilan = QWidget()


          self.data = Data()
          self.budgets = Budget()
          self.dicoBudgets = []
          self.budgetsTab = QTableWidget()
          
          self.addTab(self.tabDepense, "Dépenses")
          self.addTab(self.tabBudgets, "Budgets")
          self.addTab(self.tabBilan, "Bilan")
          
          # affichage des onglets
          self.ongletDepense()
          self.ongletBudgets()
          self.bilanTab()
          
          # paramètres de la fenêtre
          self.setWindowTitle("Gestionnaire de dépense")
          self.setFixedSize(QSize(1350, 750))

The tab where the display should be :

def ongletBudgets(self):
          print("ONGLET **BUDGET**")

          # creation of the different layouts
          layout = QVBoxLayout()

          # loading of the files countained in the repertory
          choixMois = QComboBox()
          # récupération des mois
          # pas d'appel à loadFile() car sinon création de doublons
          listMois = self.data.getMois()

          # ajout des mois dans la ComboBox de choix des mois 
          for i in range(len(listMois)):
               
               choixMois.addItem(listMois[i])


          self.remplirDico()
          
          if(len(self.dicoBudgets) == 0):
               
               # création d'un tableau vide
               situationBudgetsTab = QTableWidget(len(self.dicoBudgets), 2, self)
               situationBudgetsTab.setHorizontalHeaderLabels(['Nom Budget', 'Situation Budget'])
               
          else:
               
               # création du tableau représentant la situation des dépenses par rapport au budget
               situationBudgetsTab = QTableWidget(len(self.dicoBudgets), 2, self)
               # setup des colonnes 
               situationBudgetsTab.setHorizontalHeaderLabels(['Nom Budget', 'Situation Budget'])
               
               # rangement des valeurs dans le tableau
               for j in range(situationBudgetsTab.rowCount()-1):
                    nom = QTableWidgetItem(self.dicoBudgets[j][0])
                    # rangement de la valeur à la position courante
                    situationBudgetsTab.setItem(j, 0, nom)

                    s = str(self.dicoBudgets[j][1])

                    # on veut savoir à combien nous sommes de la limite de budget fixée
                    situation = QTableWidgetItem("0" + "/" + s[:-1])
                    # rangement de la valeur à la position courante
                    situationBudgetsTab.setItem(j, 1, situation)
               
               j = situationBudgetsTab.rowCount()-1
               # ajout du dernier élément en dur pas de '\n' ) supprimer
               nom = QTableWidgetItem(self.dicoBudgets[j][0])
               situationBudgetsTab.setItem(j, 0, nom)

               situation = QTableWidgetItem("0" + "/" + str(self.dicoBudgets[j][1]))
               situationBudgetsTab.setItem(j, 1, situation)

          
          
          # formulaire pour ajouter un budget
          dateLabel = QLabel("Nom")
          lineEdit1 = QLineEdit()        
          montantLabel = QLabel("MontantMax")
          lineEdit2 = QLineEdit()
          
          addButton = QPushButton("Ajouter", self)  
          addButton.setCheckable(True)
          
          addButton.clicked.connect(lambda: self.majBudget(lineEdit1.text(), lineEdit2.text()))

          # ajout des Widget dans le layout principal
          layout.addWidget(choixMois)
          layout.addWidget(self.printBudgetsTab())
          layout.addWidget(situationBudgetsTab)
          layout.addWidget(dateLabel)
          layout.addWidget(lineEdit1)
          layout.addWidget(montantLabel)
          layout.addWidget(lineEdit2)
          layout.addWidget(addButton)

          # affichage de ce layout
          self.tabBudgets.setLayout(layout)

The update method :

def majBudget(self, nomBudget: QLineEdit, montantMax: QLineEdit):
          # # ajout du budget dans le fichier Budget.txt
          self.budgets.addBudgetInFile(nomBudget, montantMax)
          
          self.clearDico()
          # # mise à jour de l'affichage
          self.printBudgetsTab()

The table display method :

def printBudgetsTab(self):
          
          # replisssage du dico avec les valeurs présentes dans le fichier
          self.remplirDico()
          
          # si le dictionnaire est vide, on créé juste un tableau vide
          if(not self.dicoBudgets):
               # création d'un tableau vide
               budgetsTab = QTableWidget(len(self.dicoBudgets), 2, self)
               # addition of columns
               budgetsTab.setHorizontalHeaderLabels(['Nom Budget', 'Montant Budget']) 
          
          # sinon on range les valeurs présentes dans le dictionnaire dans le tableau
          else:
               # création du tableau des budgets
               budgetsTab = QTableWidget(len(self.dicoBudgets), 2, self)
               # addition of columns
               budgetsTab.setHorizontalHeaderLabels(['Nom Budget', 'Montant Budget'])

               # rangement des valeurs dans le tableau des budgets
               for i in range(len(self.dicoBudgets)):
                    print(self.dicoBudgets)
                    nom = QTableWidgetItem(self.dicoBudgets[i][0])
                    budgetsTab.setItem(i, 0, nom)

                    s = str(self.dicoBudgets[i][1])
                    
                    montantMax = QTableWidgetItem(s[:-1])
                    budgetsTab.setItem(i, 1, montantMax)

               i = budgetsTab.rowCount()-1
                    
               # ajout du dernier élément en dur pas de '\n' ) supprimer
               nom = QTableWidgetItem(self.dicoBudgets[i][0])
               budgetsTab.setItem(i, 0, nom)
               
               montantMax = QTableWidgetItem(str(self.dicoBudgets[i][1]))
               budgetsTab.setItem(i, 1, montantMax)

          return budgetsTab

Solution

  • If you want to refresh your table display then you should use the call update()

    Add this after you add a new row:

    situationBudgetsTab.update()
    

    You could also use the repaint method which then for example you could use the following code to add 2 new rows to your table

    # Sets the number of rows to the current amount +2.
    situationBudgetsTab.setRowCount(situationBudgetsTab.rowCount() + 2)
    situationBudgetsTab.update()