pyqt如何交换文本

时间:2013-05-31 20:37:48

标签: drag-and-drop pyqt qtablewidget

我有一个QTable Widget,其中一列填充了多行,我希望能够拖放,以便我可以重新订购它们。 我可以使用内部移动执行setDragDropMode,但是当我将单元格(0,1)移动到(0,3)时 (0,3)正确获取文本,但单元格(0,1)现在为空。我想放弃它时,我想交换单元格的文本。

class myList(QtGui.QTableWidget):
    def __init__(self,parent):
        super(myList,self).__init__(parent)
#        self.setAcceptDrops(True)
        self.setDragDropMode(QtGui.QAbstractItemView.InternalMove)

1 个答案:

答案 0 :(得分:0)

您可以覆盖dropEvent回调以更改默认操作。这是第一个在两个单元格中写入值的版本。​​

class TableSwitcher(QtGui.QTableWidget):
    def dropEvent(self, dropEvent):
        item_src = self.selectedItems()[0]
        item_dest = self.itemAt(dropEvent.pos())
        src_value = item_src.text()
        item_src.setText(item_dest.text())
        item_dest.setText(src_value)

您还可以让Qt通过QTableWidgetItem调用执行默认行为(移动拖动的super并删除您放置的行为),此处您将面临默认操作将改变的挑战小部件的状态。

class TableSwitcher(QtGui.QTableWidget):
    def dropEvent(self, dropEvent):
        item_src = self.selectedItems()[0]
        item_dest = self.itemAt(dropEvent.pos())
        src_row = item_src.row()
        src_col = item_src.column()
        dest_value = item_dest.text()
        super(TableSwitcher,self).dropEvent(dropEvent)
        self.setItem(src_row,src_col, QtGui.QTableWidgetItem(dest_value))

以下是使用此类的示例代码。

app = QtGui.QApplication(sys.argv)
table = TableSwitcher()
n = 5
table.setRowCount(n)
table.setColumnCount(1)
table.setDragDropMode(QtGui.QAbstractItemView.InternalMove)

for i in range(n):
        table.setItem(i,0,QtGui.QTableWidgetItem(str(i)))

table.show()
app.exec_()