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

2024-05-02 01:11:40 发布

您现在位置:Python中文网/ 问答频道 /正文

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

很明显,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)

Tags: 数据inselfformforsqliteindex部件
1条回答
网友
1楼 · 发布于 2024-05-02 01:11:40

您继续在位置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不太熟悉,它可能是不断地在not-to-perform中添加行以及设置前面的行数。

如果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)))       

在上面的所有示例中,我还将变量重命名为更接近其用途的变量,并在item循环中使用了enumerate。最后,但并非最不重要的是,游标可以充当iterator,这意味着您可以直接循环行而不调用.fetchall(),行将根据需要获取。

相关问题 更多 >