4

我想将存储在 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)
4

1 回答 1

9

您继续在位置 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(),并且将根据需要获取行。

于 2012-08-01T08:40:16.660 回答