将一行从一个表复制到另一个

Posted

技术标签:

【中文标题】将一行从一个表复制到另一个【英文标题】:Copy a row from one table to another 【发布时间】:2021-02-17 16:17:19 【问题描述】:

我想将一个表的一整行复制到另一个表,但每次我调用这个函数时,它都会在 t2(表 2)上添加一个空行 为什么这个代码没有返回任何值

尝试

def _copyRow(self):
    self.t2.insertRow(self.t2.rowCount())   
    columnCount = self.t1.columnCount()  
    for j in range(columnCount):
        if not self.t1.item(rowCount - 2, j) is None:
            self.t1.setItem(rowCount - 1, j, QTableWidgetItem(self.t1.item(rowCount - 2, j).text()))

【问题讨论】:

请提供minimal, reproducible example。 【参考方案1】:

想法是克隆 QTableWidgetItem 并将其插入到第二个表中:

import sys
from PyQt5 import QtWidgets


def populate_table(table, prefix, rows, columns):
    table.clear()
    table.setColumnCount(columns)
    table.setRowCount(rows)
    for i in range(rows):
        for j in range(columns):
            it = QtWidgets.QTableWidgetItem(" ".format(prefix, i, j))
            table.setItem(i, j, it)


class Widget(QtWidgets.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.resize(640, 480)

        self.spinbox1 = QtWidgets.QSpinBox()
        self.spinbox2 = QtWidgets.QSpinBox()
        self.button = QtWidgets.QPushButton("Move")
        self.table1 = QtWidgets.QTableWidget()
        self.table2 = QtWidgets.QTableWidget()

        lay = QtWidgets.QGridLayout(self)
        lay.addWidget(self.spinbox1, 0, 0)
        lay.addWidget(self.spinbox2, 0, 1)
        lay.addWidget(self.button, 1, 0, 1, 2)
        lay.addWidget(self.table1, 2, 0)
        lay.addWidget(self.table2, 2, 1)

        populate_table(self.table1, "Table1", 3, 4)
        populate_table(self.table2, "Table2", 4, 3)

        self.spinbox1.setMaximum(self.table1.rowCount() - 1)
        self.spinbox2.setMaximum(self.table2.rowCount() - 1)

        self.button.clicked.connect(self.handle_clicked)

    def handle_clicked(self):
        self.copy_rows(
            self.table1, self.spinbox1.value(), self.table2, self.spinbox2.value()
        )
        self.spinbox1.setMaximum(self.table1.rowCount() - 1)
        self.spinbox2.setMaximum(self.table2.rowCount() - 1)

    def copy_rows(self, from_table, row1, to_table, row2):
        if row1 >= from_table.rowCount():
            return

        if from_table.columnCount() > to_table.columnCount():
            to_table.setColumnCount(from_table.columnCount())

        if row2 >= to_table.rowCount() or row2 < 0:
            row2 = to_table.rowCount()

        to_table.insertRow(row2)

        for i in range(from_table.columnCount()):
            item = from_table.item(row1, i)
            if item is not None:
                to_table.setItem(row2, i, item.clone())


if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    w = Widget()
    w.show()
    sys.exit(app.exec_())

【讨论】:

可以双击添加行吗? @PeterTorben 我只实现了问题所要求的内容,我不会在每次 OP 需要新请求时添加更多内容,所以我将您作为任务来执行双击操作。如果您想学习使用工具,那么您必须尝试、失败、尝试等等。再见。另请阅读How to Ask 并检查tour

以上是关于将一行从一个表复制到另一个的主要内容,如果未能解决你的问题,请参考以下文章

[MySql]如何将一行从一个表复制到另一个并填充额外的列?

如何从一个DataTable中复制数据行到另一个DataTable中

将数据从一个表复制到另一个表并更改 id [重复]

如何使用 Excel VBA 将特定行从多个工作表复制到另一个工作表?

触发器将同一行复制到另一个表中

将一个数据库表的数据复制到另一个