您继续在位置 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)))
如果该.rowcount
值不可用(设置为 1 或类似值),也许首先向数据库询问行数会有所帮助:
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
项目循环。最后但并非最不重要的一点是,游标可以充当迭代器,这意味着您可以直接遍历行而无需调用.fetchall()
,并且将根据需要获取行。