如何将 QTableWidget 作为函数的参数传递

Posted

技术标签:

【中文标题】如何将 QTableWidget 作为函数的参数传递【英文标题】:How to pass QTableWidget as an argument on function 【发布时间】:2020-08-04 21:32:38 【问题描述】:

我有导出到 excel 函数和一堆 QTableWidgets。我知道如果我为每个 tablewidget 制作每个函数是非常低效的,但是如何将 tablewidget 作为函数的参数传递?

    def writeCsv(self):
        path, _ = QFileDialog.getSaveFileName(self, 'Save File', QDir.homePath() + "/export.csv", "CSV Files(*.csv *.txt)")
        if path:
            with open(path, 'w') as stream:
                print("saving", path)
                writer = csv.writer(stream, dialect = 'excel', delimiter = ',')
                headers = []
                for column in range(self.tableWidget_show.columnCount()):
                    header = self.tableWidget_show.horizontalHeaderItem(column)
                    if header is not None:
                        headers.append(header.text())
                    else:
                        headers.append("Column " + str(column))
                writer.writerow(headers)
                for row in range(self.tableWidget_show.rowCount()):
                    rowdata = []
                    for column in range(self.tableWidget_show.columnCount()):
                        item = self.tableWidget_show.item(row, column)
                        if item is not None:
                            rowdata.append(item.text())
                        else:
                            rowdata.append('')
                    writer.writerow(rowdata)

我想使用self.tableWidget_show 部分作为参数,这样我每次有其他Qtablewidget 时都可以更改参数

【问题讨论】:

【参考方案1】:

首先让每个函数执行最小的任务,以便调试容易,例如在你的情况下,没有必要在那里使用 QFIleDialog 来选择文件,而只接收路径,并在另一个函数中进行选择。另一方面,使用的信息存储在模型中而不是视图中,因此可以通过保存模型而不是 QTableWidget 来概括它,因此您也可以将其用于任何类型的 QTableView。

def write_model_to_csv(self, model, filename):
    with open(filename, "w") as stream:
        writer = csv.writer(stream, dialect="excel", delimiter=",")
        headers = []
        for column in range(model.columnCount()):
            text = model.headerData(column, Qt.Horizontal)
            if text:
                headers.append(text)
            else:
                headers.append("Column ".format(column))
        writer.writerow(headers)
        for row in range(model.rowCount()):
            rowdata = []
            for column in range(model.columnCount()):
                text = model.index(row, column).data()
                if text:
                    rowdata.append(text)
                else:
                    rowdata.append("")
            writer.writerow(rowdata)
path, _ = QFileDialog.getSaveFileName(
    self, "Save File", QDir.homePath() + "/export.csv", "CSV Files(*.csv *.txt)"
)
if path:
    self.write_model_to_csv(self.tableWidget_show.model(), path)

【讨论】:

天啊,你太棒了。谢谢大家的解释。你为我省了几千行!!!

以上是关于如何将 QTableWidget 作为函数的参数传递的主要内容,如果未能解决你的问题,请参考以下文章

如何将关键字参数作为参数传递给函数?

当我们将数组作为参数传递给其他函数时,数组的值如何变化? [复制]

如何将 JS 函数的引用作为参数传递给 ExternalInterface 调用?

如何将带有 args 的成员函数作为参数传递给另一个成员函数?

如何将函数与表连接起来,并将表列作为参数传递给雪花中的函数

QML:如何将javascript函数作为参数传递给另一个函数