Ami*_*mir 3 python sqlite pyqt qtablewidget
我想将存储在 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)
Run Code Online (Sandbox Code Playgroud)
您继续在位置 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)))
Run Code Online (Sandbox Code Playgroud)
我对 QtTableWidget 不太熟悉,可能是因为不断添加行而不会执行以及预先设置行数。
如果cursor.rowcount在您的查询中正确更新了sqlite 的属性(并非总是如此),您最好.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)))
Run Code Online (Sandbox Code Playgroud)
如果该.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)))
Run Code Online (Sandbox Code Playgroud)
在上面的所有示例中,我还将变量重命名为更接近其用途的变量,并且也用于enumerate项目循环。最后但并非最不重要的是,游标可以充当迭代器,这意味着您可以直接遍历行而无需调用,.fetchall()并且将根据需要获取行。
| 归档时间: |
|
| 查看次数: |
9831 次 |
| 最近记录: |