【问题标题】:Inserting data from sqlite database to QTableWidget using PyQt in Python在 Python 中使用 PyQt 将数据从 sqlite 数据库插入到 QTableWidget
【发布时间】:2012-07-30 02:06:55
【问题描述】:

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

【问题讨论】:

    标签: python sqlite pyqt qtablewidget


    【解决方案1】:

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

    【讨论】:

    • 谢谢,现在可以了。您的第一个示例运行良好,正如您所说,它以一个空行结束。但是您的第二个示例效果不佳,它只是制作一行并填充它。抱歉我的愚蠢问题,我是 python 新手。
    • @Amir:对,这意味着rowcount 没有正确反映数字结果,这可以在 sqlite 中发生。将行数设置为 0 并在插入数据之前插入行。更新了我的答案。
    • @Amir:进一步细化为a)建议您以一种或另一种方式获取行数,b)使用游标作为迭代器而不是调用.fetchall()
    • 谢谢,我正在学习 python,你帮我提供了很多有用的信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-15
    • 2011-02-12
    • 2018-11-24
    • 1970-01-01
    相关资源
    最近更新 更多