PyQt5将QTableWidget从一个单元格移动到另一个单元格

时间:2017-07-17 17:21:31

标签: python qt pyqt pyqt5

我在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上。

您有任何想法或建议吗? (我确定有一种或多种方法可以解决我的问题但是,就像新手一样,我无法弄明白一个)

1 个答案:

答案 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