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.