Как передать QTableWidget в качестве аргумента функции - PullRequest
1 голос
/ 05 августа 2020

У меня есть функция экспорта в Excel и куча QTableWidgets. Я знаю, что делать каждую функцию для каждого виджета таблицы очень неэффективно, но как передать виджет таблицы в качестве аргумента функции?

    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 Ответ

2 голосов
/ 05 августа 2020

Прежде всего, заставьте каждую функцию выполнять наименьшую задачу, чтобы упростить отладку, например, в вашем случае нет необходимости использовать 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)
...