def dropEvent(self, event: QDropEvent): if event.mimeData().hasText(): if self.startRow != self.targetRow - 1 and self.startRow != self.targetRow: print('move ', self.startRow, ' to ', self.targetRow) if self.targetRow > self.startRow: self.model.moveProcess(self.startRow, self.targetRow - 1) else: self.model.moveProcess(self.startRow, self.targetRow) event.acceptProposedAction() return event.ignore() QTableView.dropEvent(self, event)
def dropEvent(self, event): if event.source() == self and (event.dropAction() == Qt.MoveAction or self.dragDropMode() == QAbstractItemView.InternalMove): success, row, col, topIndex = self.dropOn(event) if success: selRows = self.getSelectedRowsFast() top = selRows[0] # print 'top is %d'%top dropRow = row if dropRow == -1: dropRow = self.rowCount() # print 'dropRow is %d'%dropRow offset = dropRow - top # print 'offset is %d'%offset for i, row in enumerate(selRows): r = row + offset if r > self.rowCount() or r < 0: r = 0 self.insertRow(r) # print 'inserting row at %d'%r selRows = self.getSelectedRowsFast() # print 'selected rows: %s'%selRows top = selRows[0] # print 'top is %d'%top offset = dropRow - top # print 'offset is %d'%offset for i, row in enumerate(selRows): r = row + offset if r > self.rowCount() or r < 0: r = 0 for j in range(self.columnCount()): # print 'source is (%d, %d)'%(row, j) # print 'item text: %s'%self.item(row,j).text() source = QTableWidgetItem(self.item(row, j)) # print 'dest is (%d, %d)'%(r,j) self.setItem(r, j, source) # Why does this NOT need to be here? # for row in reversed(selRows): # self.removeRow(row) event.accept() else: QTableView.dropEvent(event)