是否可以将行从 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)
不幸的是,这不会让您对单元格小部件执行任何操作。当在项目视图中的单元格上设置小部件时,视图将获得小部件的完整和 最终 所有权:即使您尝试使用 removeWidget
或 setCellWidget
与另一个小部件,前一个将被 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)
我有一行在一些单元格中包含文本数据,而其他单元格中有小部件,我可以将这些单元格转移到行中吗,所以我的意思是将整行转移到另一个 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)
不幸的是,这不会让您对单元格小部件执行任何操作。当在项目视图中的单元格上设置小部件时,视图将获得小部件的完整和 最终 所有权:即使您尝试使用 removeWidget
或 setCellWidget
与另一个小部件,前一个将被 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)