我想将存储在sqlite表中的数据插入QTableWidget
。我使用两个for
循环来查找数据和索引。在每次迭代之后,我在控制台中打印数据并且没有问题,但是当它显示表格小部件时,只有第一行和最后一行填充了数据。
有什么想法解决这个问题吗?
很明显tblTable
是QTableWidget
!
以下是代码的这一部分:
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)
答案 0 :(得分:4)
您继续将新行插入位置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
。最后但并非最不重要的是,游标可以充当iterator,这意味着您可以直接循环遍历行而不调用.fetchall()
,并且将根据需要提取行。