# Autres langages > Python > GUI >  PySide2 : Mettre  jour un QTableView aprs insertion d'un nouvel enregistrement en base de donnes

## master4

Bonsoir, 

J'aimerais savoir comment mettre  jour un tableau de donnes cr avec PySide2 (QAbractractTable et QtableView) aprs insertion d'un nouvel enregistrement en base donnes. En fait, je voudrais que ce tableau s'actualise automatiquement aprs cette insertion pour afficher le dernier enregistrement. 

Merci.

Ci-joint une capture d'cran.
N.B : les infos dans ce tableau sont fictifs  ::):

----------


## tyrtamos

Bonjour,

Suggestion:  essayer la mthode ".select()" du modle utilis. Elle est cense "peupler" (populate) le modle avec la base de donnes, et de rafraichir le widget graphique.

Je suppose que c'est une base de donnes "multi-utilisateurs". Si c'est sqlite3, ce n'est pas une bonne ide d'accder  la base de donnes de 2 manires diffrentes en mme temps.

----------


## master4

Merci @tyrtamos pour cette suggestion. En fait, cette mthode de s'applique que sur QSqlRelationalTableModel.

----------


## tyrtamos

Bonjour,

C'est bien QSqlRelationalTableModel que j'utilise. Mais comme ".select()" fonctionne aussi sur QSqlTableModel, c'est que l'accs n'est pas avec une base de donnes?

Alors, il faut prciser la structure de donnes (liste  2 dimensions?), ainsi que le modle utilis (QStandardItemModel?).

Il faut aussi prciser ce qui doit dclencher la mise  jour du QTableView aprs une modification des donnes: si c'est un simple bouton cliqu par l'utilisateur qui affiche le QTableView, on peut toujours dclencher l'effacement du modle QStandardItemModel avec .clear() et tout reconstruire (y compris les en-ttes!) avec les nouvelles donnes.

Et s'il s'agit d'une liste  2 dimensions, et que l'dition de nouvelles donnes est possible  partir du QTableView, il faut prciser quelles prcautions on prend pour permettre des modifications de cette liste avec des accs multiples et simultanes (verrous?).

A noter que je ne raisonne qu'avec PyQt5-Qt5 puisque je ne connais pas PySide2.

----------


## master4

Le raisonnement propos me semble logique. Cependant, il me faudrait les mthodes adquates pour y arriver. 

Quand le lis la doc officielle, parmi les mthodes de QAbstractTableModel et QtableView ne figure pas la mthode ".select()". Mais dans celles de QSqlTableModel, oui.

La mise  jour devrait se dclencher quand je clique sur le bouton "ajouter". Sauf que quand je clique dessus, l'affichage n'est pas mis  jour. 

Les liens des docs que j'ai consultes : 

*QAbstractTableModel,*

*QTableView*

*QSqlTableModel*

----------


## tyrtamos

Je ne sais toujours pas quelle est ta structure de donnes: liste  2 dimensions? Si oui, il vaudrait mieux utiliser QStandardItemModel qui est moins basique.

Sous quelle forme apparait-elle? un fichier? une liste du programme modifie par un thread? etc... A priori, elle doit permettre  une action asynchrone de la modifier alors qu'elle est dj "branche" sur le modle (sinon le problme ne se poserait pas).

En principe, les mises  jour "normales" vont du QTableView => donnes, en passant par le modle qui fait le lien entre les 2. Mais ici, tu veux faire le contraire, d'o la difficult.

En fonction du peu que tu donnes comme infos, je t'ai donn une solution dans le message prcdent: reconstruire le modle avec les nouvelles donnes pour faire la mise  jour de l'affichage.

----------


## master4

Effectivement, ma structure de donnes est une liste  deux dimensions. 

Je n'ai pas compris cette question : 


> Sous quelle forme apparait-elle? un fichier? une liste du programme modifie par un thread?


Voici mon code : 

QAbstractractTableModel 



```

```

Classe Utilisateur :


```

```

Classe de principale (lancement de la fnetre)



```

```

Merci de ton aide @tyrtamos

----------


## tyrtamos

Bonjour,

C'est trop compliqu pour moi d'plucher ton code. Je te propose plutt un code test qui essaie de rpondre plus prcisment  ta question. C'est du PyQt5, mais la conversion en PySide2 devrait tre simple.



```

```

Tu remarques 3 boutons:
- le 1er modifie une valeur de la liste de base. Aprs cette modification, l'affichage dans le QTableView ne change pas et affiche toujours l'ancienne liste.
- le 2me bouton raffiche les nouvelles donnes dans le QTableView en passant par le modle. A dfaut d'une mthode de type "update", on reconstruit tout.
- le 3me bouton rcupre les donnes affiches dans le QTableView, et les affiche en console (tu n'as pas demand cette fonction mais c'est utile  savoir).

----------


## master4

Bonjour, 

J'ai rsolu mon problme. Avec un peu plus d'imagination , je suis arriv  quelque chose de fonctionnel mais je ne sais pas si la bonne faon de faire mme si a a march. 
En fait, j'ai ajout quelques lignes de codes dans mon ancien code. Donc aprs que j'ai cliqu sur le bouton "ajouter"qui me permet d'ajouter un nouvel utilisateur, les actions suivantes se dclenchent :


```

```

Ce n'est pas encore propre mais je vais l'amliorer. 

Merci bcp @tyrtamos pour ton aide  ::ccool::

----------

