PyQt QTableWidget setItem循环

3

我已经能够使用 QTableWidget 和 QTableWidgetItem 将数据库中的信息填充到 QTableWidget 中,基于搜索栏返回的文本。虽然我能够将搜索项的所有信息填充到表格窗口小部件中,但我无法持续地从搜索栏添加产品到表格窗口小部件中。相反,结果只是被覆盖和替换。这是我的代码示例。

# Defines Search Bar Button
def search_Bar(self):
    searchFor = self.searchBar.text()
    #print(searchFor)
    searchQ = c.execute(" SELECT * FROM databasetable WHERE title LIKE ('%' || ? || '%') ", (searchFor,))
    self.tableWidget.setRowCount(0)
    for row_number, row_data in enumerate(searchQ):
        self.tableWidget.insertRow(row_number)
        for column_number, data in enumerate(row_data):
            self.tableWidget.setItem(row_number, column_number, QTableWidgetItem(str(data)))

上面的代码可以得到我想要的结果,但是当我尝试添加多个项目到QTableWidget时,它会覆盖先前选择的项目。

是否可以在不覆盖先前选择的情况下设置setItem?我想创建一个所需搜索结果的表格。如果需要,我们希望有清空表格的选项。

2个回答

2
为了将搜索结果附加到表格中而不覆盖以前的表格内容,只需在添加项目之前不调用setRowCount(0),并使用当前的rowCount()作为row_number:
# Append search results to table
def search_Bar(self):
    searchFor = self.searchBar.text()
    searchQ = c.execute(" SELECT * FROM databasetable WHERE title LIKE ('%' || ? || '%') ", (searchFor,))
    for row_data in searchQ:
        # insert new row at the end of the tableWidget
        row_number = self.tableWidget.rowCount()
        self.tableWidget.insertRow(row_number)
        for column_number, data in enumerate(row_data):
            self.tableWidget.setItem(
                row_number, column_number, QTableWidgetItem(str(data)))

如果你想清空表格(例如通过点击“清空表格”按钮),你可以调用以下函数:
# Clear the table
def clear_table(self):
    self.tableWidget.setRowCount(0)

您提供的代码奇怪地运行了,但不再将数据填充到表中。我尝试对其进行调整,发现只需删除 setRowCount(0),表格就可以正常运行并按预期填充。我尝试了多种设置 rowCount()row_number 的方法,但都无法找到实际将项目填充到表格中的解决方案。无论如何,我非常感谢您的知识,因为我最终还是让它工作了。 - Notmeomg

1

如果有人偶然发现这个问题,我已经找到了以下解决方案。

行数计数需要放在循环内部以便它可以保持递增,我最初将该行代码放在循环之上,所以遇到了问题。

for elem in res_a:
    domain_a = elem.host
    row_number = self.w_tablewidget.rowCount()
    self.w_tablewidget.insertRow(row_number)
    self.w_tablewidget.setItem(
    row_number, 0, QTableWidgetItem(str(site)))
    self.w_tablewidget.setItem(
                    row_number, 1, QTableWidgetItem(str('A')))
    self.w_tablewidget.setItem(
                    row_number, 2, QTableWidgetItem(str(elem.host)))

我想提醒您,您可以使用 "setRowCount(0)" 或 ".clearContents()" 来清除它。

例如:

self.w_tablewidget.clearContents()
self.w_tablewidget.setRowCount(0)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接