使用Python中的PyQt将数据从sqlite数据库插入QTableWidget

时间:2012-08-01 07:50:26

标签: python sqlite pyqt qtablewidget

我想将存储在sqlite表中的数据插入QTableWidget。我使用两个for循环来查找数据和索引。在每次迭代之后,我在控制台中打印数据并且没有问题,但是当它显示表格小部件时,只有第一行和最后一行填充了数据。 有什么想法解决这个问题吗?

很明显tblTableQTableWidget

以下是代码的这一部分:

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)

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(),并且将根据需要提取行。