【问题标题】:PyQt QTableWidget setItem loopPyQt QTableWidget setItem 循环
【发布时间】:2018-08-02 15:58:48
【问题描述】:

我已经能够使用 QTableWidget 和 QTableWidgetItem 根据搜索栏中返回的文本将数据库中的信息填充到 QTableWidget 中。虽然我能够让搜索到的项目将所有信息填充到 tablewidget 中,但我无法继续将搜索栏中的产品添加到 tablewidget 中。相反,结果只是被覆盖和替换。这是我的代码示例。

# 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 添加多个项目时,它会覆盖之前选择的项目。

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

【问题讨论】:

    标签: python qt pyqt qtablewidget qtablewidgetitem


    【解决方案1】:

    为了在不覆盖之前的表格内容的情况下将搜索结果附加到表格中,只需在添加项目之前不要调用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,但找不到将项目实际填充到表中的解决方案。无论哪种方式,我都非常感谢这些知识,因为我能够让它发挥作用。
    【解决方案2】:

    万一其他人偶然发现了这个,我可以使用下面的方法来解决这个问题。

    行数需要在循环内,因为它会不断增加,我最初在循环上方也有该行并且遇到了问题。

    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)
    

    【讨论】:

      猜你喜欢
      • 2019-01-12
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2016-12-29
      • 1970-01-01
      • 2021-10-28
      • 1970-01-01
      • 2019-05-14
      相关资源
      最近更新 更多