新しい行を位置 1 に挿入し続けます。前に入力したデータが 1 行上に移動し、その時点で次のループでそのデータを上書きします。
したがって、最初の反復ではすべてが行 0 に挿入され、インデックス 1 に行が追加されます。次に、行 1 をデータで更新し、位置 1 に別の行を挿入して、以前に変更された行を行 2 に移動させます。次のループでは、行 2 のデータを上書きし、位置 1 に別の空の行を挿入し、データのある行を位置 3 に移動して、もう一度上書きします。
最初に行数を 0 に設定し、必要に応じて行を挿入してから、列データを挿入します。
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)))
私は QtTableWidget に精通していません。行数を事前に設定するだけでなく、行を継続的に追加しても実行されない可能性があります。
クエリでsqlite のcursor.rowcount
属性が適切に更新されている場合 (常に更新されるとは限りません)、.setRowCount
その値で呼び出した方がよいでしょう:
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)))
値が利用できない場合 (1 などに設定されている場合.rowcount
)、最初にデータベースに行数を問い合わせることが役立つ場合があります。
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)))
上記のすべての例で、変数の名前をその使用に少し近い名前に変更enumerate
し、アイテム ループでも使用しました。最後になりましたが、カーソルはiteratorとして機能できます。つまり、呼び出しを行わずに行を直接ループでき.fetchall()
、行は必要に応じてフェッチされます。