4 votes

Insertion de données d'une base de données sqlite dans QTableWidget en utilisant PyQt en Python

Je veux insérer mes données qui sont stockées dans une table sqlite, dans un fichier QTableWidget . J'utilise deux for Après chaque itération, j'imprime les données dans la console et tout va bien, mais lorsque le widget de table s'affiche, il n'y a que la première et la dernière ligne remplies avec les données. Une idée pour résoudre ce problème ?

Il est évident que tblTable est un QTableWidget !

Voici cette partie du code :

cursor.execute('''SELECT * FROM MyTable''')
for index , form in enumerate(cursor.fetchall()):
    i = 0
    for item in form:
        print(str(item))
        self.tblTable.setItem(index, i, QtGui.QTableWidgetItem(str(item)))       
        i = i + 1
    self.tblTable.insertRow(1)

9voto

Martijn Pieters Points 271458

Vous continuez à insérer votre nouvelle ligne à la position 1. Ce qui se passe, c'est que les données précédemment saisies sont alors déplacées d'une ligne vers le haut, et que vous écrasez ces données dans la boucle suivante.

Donc, à la première itération, tout est inséré dans la ligne 0, vous ajoutez une ligne à l'index 1. Puis on met à jour la ligne 1 avec des données, et insérer une autre rangée à la position 1, faisant passer la rangée précédemment modifiée à la rangée 2 . Dans la boucle suivante, vous écrasez les données de la ligne 2, vous insérez une autre ligne vide en position 1, vous déplacez la ligne contenant les données en position 3 et vous l'écrasez à nouveau, etc.

Définissez le nombre de lignes à 0 au début, et insérez des lignes au fur et à mesure que vous en avez besoin. avant vous insérez les données de votre colonne :

cursor.execute('''SELECT * FROM MyTable''')
self.tblTable.setRowCount(0)
for row, form in enumerate(cursor):
    self.tblTable.insertRow(row)
    for column, item in enumerate(form):
        print(str(item))
        self.tblTable.setItem(row, column, QtGui.QTableWidgetItem(str(item)))       

Je ne suis pas très familier avec le QtTableWidget, il se peut que l'ajout continu de rangées ne soit pas aussi efficace que la définition du nombre de rangées au départ.

Si la méthode de sqlite cursor.rowcount est correctement mis à jour dans votre requête (ce n'est pas toujours le cas), il vaut mieux appeler .setRowCount avec cette valeur :

cursor.execute('''SELECT * FROM MyTable''')
self.tblTable.setRowCount(cursor.rowcount)
for row, form in enumerate(cursor):
    for column, item in enumerate(form):
        self.tblTable.setItem(row, column, QtGui.QTableWidgetItem(str(item)))       

Si le .rowcount n'est pas disponible (définie à 1 ou similaire), peut-être que demander d'abord à la base de données le nombre de lignes peut aider :

rowcount = cursor.execute('''SELECT COUNT(*) FROM MyTable''').fetchone()[0]
self.tblTable.setRowCount(rowcount)
cursor.execute('''SELECT * FROM MyTable''')
for row, form in enumerate(cursor):
    for column, item in enumerate(form):
        self.tblTable.setItem(row, column, QtGui.QTableWidgetItem(str(item)))       

Dans tous les exemples ci-dessus, j'ai également renommé vos variables en quelque chose d'un peu plus proche de leur utilisation, et utilisé enumerate sur la boucle de l'article également. Enfin, et surtout, le curseur peut faire office de itérateur ce qui signifie que vous pouvez boucler sur les rangs directement sans appeler .fetchall() et les lignes seront récupérées au besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X