是否可以将行从 qtablewidget 传输到另一个 qtablewidget?

is it possible to transfer row from qtablewidget to another qtablewidget?

我有一行在一些单元格中包含文本数据,而其他单元格中有小部件,我可以将这些单元格转移到行中吗,所以我的意思是将整行转移到另一个 qtablewidget 而不必将行分成小数据然后再将它重建到另一个 qtablewidget 中? 注意:请不要问我最小的亲——因为我只是在做之前问,所以我知道等待我的是什么。

QTableWidget 没有这样的功能(唯一类似的功能只存在于 QStandardItemModel:takeRow())。

要删除项目,您需要使用 insertRow() on the target table, takeItem() for each column in the source row, and setItem() on the target, and finally removeRow()

    def moveRow(self, row):
        targetRow = self.target.rowCount()
        self.target.insertRow(targetRow)
        for column in range(self.source.columnCount()):
            item = self.source.takeItem(row, column)
            if item:
                self.target.setItem(targetRow, column, item)
        self.source.removeRow(row)

不幸的是,这不会让您对单元格小部件执行任何操作。当在项目视图中的单元格上设置小部件时,视图将获得小部件的完整和 最终 所有权:即使您尝试使用 removeWidgetsetCellWidget 与另一个小部件,前一个将被 Qt 内部 删除(参见 QAbstractItemView.setIndexWidget() 的来源,removeWidget setCellWidget).

唯一的解决方案是检查单元格是否有小部件,创建相同的新实例 class 并复制其属性。

一个可能的解决方法是使用带有布局的 container 小部件添加单元格小部件,将实际的小部件添加到该布局,然后创建一个新容器并设置布局它:

    # add a container for the actual widget
    container = QtWidgets.QWidget()
    contLayout = QtWidgets.QVBoxLayout(container)
    # layout usually add some margins to their widgets, let's remove them
    contLayout.setContentsMargins(0, 0, 0, 0)
    testButton = QtWidgets.QPushButton('test')
    contLayout.addWidget(testButton)
    self.source.setCellWidget(0, 0, container)

def moveRow(self, row):
    # ...
        widget = self.source.cellWidget(row, column)
        if widget and widget.layout() is not None:
            newContainer = QtWidgets.QWidget()
            newContainer.setLayout(widget.layout())
            self.target.setCellWidget(targetRow, column, newContainer)
    self.source.removeRow(row)