添加到 QTableWidget 是错误的

Posted

技术标签:

【中文标题】添加到 QTableWidget 是错误的【英文标题】:Addeed into QTableWidget is wrong 【发布时间】:2013-09-10 05:57:19 【问题描述】:

我有以下代码,我的查询工作正常:

    ###initilize Objects
    self.dbObj = DbAbsLayer()
    self.tableObj = MaterialsTable(dict()) 

    ####making queries, one for count row, another for result row
    query = self.dbObj.session.query(MaterialsTable)
    rowCounter = self.dbObj.session.query(MaterialsTable)
    for attr , val in tmpDict.items():
        query = query.filter(getattr(MaterialsTable,attr).like("%%%s%%" % val)).all()
        rowCounter = rowCounter.filter(getattr(MaterialsTable,attr).like("%%%s%%" % val)).count()
    ##### commit my queries
    self.dbObj.session.commit()
    ####setting up my QtableWidget 
    searchFrameObject.tableWidget.setRowCount(rowCounter)
    searchFrameObject.tableWidget.setColumnCount(5)
    ######inserting into QtableWidget
    for row in range(rowCounter):
        for result in query:
            item = QtGui.QTableWidgetItem(_fromUtf8(result.name))
            item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEnabled)
            searchFrameObject.tableWidget.setItem(row,0,item)

            item = QtGui.QTableWidgetItem(_fromUtf8(integerToPersian(result.bought_price)))
            item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEnabled)
            searchFrameObject.tableWidget.setItem(row,1,item)

            item = QtGui.QTableWidgetItem("date")#result.bought_date)
            item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEnabled)
            searchFrameObject.tableWidget.setItem(row,2,item)


            item = QtGui.QTableWidgetItem(_fromUtf8(integerToPersian(result.stock)))
            item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEnabled)
            searchFrameObject.tableWidget.setItem(row,3,item)
            print result.stock
            print integerToPersian(result.stock)
            item = QtGui.QTableWidgetItem(_fromUtf8(integerToPersian(result.minimum_bound)))
            item.setFlags(item.flags() ^ QtCore.Qt.ItemIsEnabled)
            searchFrameObject.tableWidget.setItem(row,4,item)
            print result.minimum_bound

在我的循环中,print result.stockresult.minimum.bound 我可以看到我在 DB 中的所有内容,我可以在 phpMyAdmin 中看到,但是当我添加到 QTableWidget 时,我看到添加的最后一个结果。

我的问题是,如何将每个结果添加到QTableWidget

【问题讨论】:

不幸的是,我找到了marcogiordanotd.com/blog/uncategorized/… 你知道吗?或者你之前在循环中使用过 setItem 吗? 【参考方案1】:

这是你做错了:

for row in range(rowCounter):
    for result in query:

您在每一行中将来自query 的所有结果写在前面的result 之上,这就是为什么您只能看到最后一个结果。

可能的解决方案(假设query 是数组):

for row in range(rowCounter):
    result = query[row]
    item = ....
    .....

这样query 中包含的每个结果都将写入一个(新)行(5 列)中。 您需要检查您的 rowCounter 是否与您的 query 长度相同(如果您想每行显示一个结果,则应该是这样)

如果您仍然不明白哪里出了问题,请随时询问:)

【讨论】:

print result.stock 每三个循环打印 1 2 3 因为对于每个 result.stock 我在数据库中存储了 1 、 2 和 3 ,请确保我的查询是真的。 ` for result in query[row]: TypeError: 'MaterialsTable' object is not iterable`,当我用 rowCounter 测试时,我得到了真实的结果。 当然它会打印“1 2 3”,但是当 row = 0 时,你会在 row 中写入结果(result.stock=1)。结果在 for 循环中,因此它将在同一行中写入第二个结果(一个带有 result.stock=2 的结果)。再一次,结果(result.stock=3 的结果)将覆盖最后一个但也在同一行中。因此,它将打印“1 2 3”,但只有 result.stock=3 的结果才会显示在 tableWidget 中。 我没有说通过 query[row] 循环结果,我说的是 result = query[row] 。看看我的回答“可能的解决方案” 只需更改那一行,它应该可以工作(每行填充一个结果)。另外,rowCounter 的长度应该是 query(我可以看到你只用结果填充表格)

以上是关于添加到 QTableWidget 是错误的的主要内容,如果未能解决你的问题,请参考以下文章

不能在 QTableWidget 中添加两列。错误 - DeprecationWarning:需要一个整数(获取类型浮点数)

如何将新行添加到现有的 QTablewidget

在 PyQt 中将图像添加到 QTableWidget

如何将 QTableWidget 添加到 QTreeWidget 但作为 QTreeWidgetItem

在 PyQt 中将多个小部件添加到 QTableWidget 单元格

将小部件添加到 qtablewidget pyqt