我在PyQt5应用程序中有一个6x1(6行,1列)QTableWidget表。
当程序启动时,所有表格的单元格都填充了带有灰色背景的QTableWidgetItem
self.shaftsTable = QtWidgets.QTableWidget()
# table setups (...)
for i in range(self.nf):
for j in range(self.nc):
item = QtWidgets.QTableWidgetItem()
item.setBackground(QtGui.QColor(200,200,200))
self.shaftsTable.setItem(i, j, item)
然后将QtWidgets.QListWidget放在最低的单元格中(第5行,第0列)
el = QtWidgets.QListWidget(Window)
self.shaftsTable.setCellWidget(5, 0, el)
假设该表将模拟通过6层楼的电梯路径:电梯是QtWidgets.QListWidget,其中包含当前在电梯中的所有乘客的列表;电梯从最低层开始,因此它被放置在桌子的位置(5,0)。
我想将电梯从单元格(5,0)移动到单元格(4,0),也就是说,在从最低层移动到下一层之后,电梯将仅位于单元格(4,0)中不在单元格中(5,0)。
以下方法无法正常工作,因为removeCellWidget()也将从单元格(4,0)中明确删除对象:
el = self.shaftsTable.cellWidget(5, 0)
self.shaftsTable.setCellWidget(4, 0, el)
self.shaftsTable.removeCellWidget(5, 0)
我没有找到任何简单的功能来完成我在PyQt文档中所需的功能http://pyqt.sourceforge.net/Docs/PyQt4/qtablewidget.html
我试图复制(使用copy.deepcopy())电梯,将副本放在单元格(4,0)中,然后删除单元格中的原始电梯(5,0),但copy.deepcopy()失败在QtWidgets.QListWidget上。
您有任何想法或建议吗? (我确定有一种或多种方法可以解决我的问题但是,就像新手一样,我无法弄明白一个)
答案 0 :(得分:0)
此处的报价https://forum.qt.io/topic/61590/take-a-widget-from-a-qtablewidget
从QTableWidget
中获取一个小部件当您使用setCellWidget时,QTableWidget将拥有该小部件。 阅读文档,似乎没有办法收回所有权 cellWidget()只允许访问它而不是将其取回。
所以一种方法是创建可以根据需要创建小部件的功能 当你想要将它们“交换”时,只需重新创建小部件 你不能真正复制。
所以你可以创建一个带小部件并复制一些数据的函数 从中并使用这些数据创建新的 如果未提供widget,则使用默认值创建一个新的。
因此,无法从QTableWidget的单元格中获取QTableWidget的所有权,以便将其移动到另一个单元格。
唯一的解决方案是制作要移动的QTableWidget的副本,将副本放入目标单元格(在我的案例中为单元格(4,0)),然后从原始单元格中删除原始QTableWidget对象(在我的案例单元格(5,0))。
new_el = QtWidgets.QListWidget(Window)
el = self.shaftsTable.cellWidget(5, 0)
# copy contents of el into new_el with a custom function:
def unloadAllPassengers(el):
unloaded = []
for _ in range(el.count()):
unloaded.append(el.takeItem(0))
return unloaded
def loadPassengersAsQListWidgetItemArray(el, qListWidgetItemArray):
for i in range(len(qListWidgetItemArray)):
el.addItem(qListWidgetItemArray[i])
loadPassengersAsQListWidgetItemArray(new_el, unloadAllPassengers(el))
self.shaftsTable.setCellWidget(5, 0, None)
self.shaftsTable.setCellWidget(4, 0, new_el)
# an elevator is in cell (4,0) whlist "el" does not exists anymore
# problem solved