PyQt:从列表视图中拖动项目并删除到表视图,drop index始终为-1

时间:2016-05-28 07:17:06

标签: python qt drag-and-drop pyqt pyqt4

在我的代码中,我已成功将Drag n Drop从一个QListView实现到另一个QListView,内部移动也正常。 现在,由于必要性,我修改了接受drop的视图,即我试图从QListView拖动到QTableView。

问题是,当我放在QTableView上时,每次打印无效索引,即-1(在dropEvent()中打印时。

在我之前在列表视图之间的实现中,即使在项目之间删除项目,索引也已适当更新。这不是这种情况。谢谢回答。

class SerialTestStepListView(QtGui.QTableView):
    itemSelectionChanged = pyqtSignal()
    casualSignal3 = pyqtSignal()
    casualSignal4 = pyqtSignal()

    def __init__(self,parent = None):
        QListView.__init__(self, parent)
        self.setAcceptDrops(True)
        # Hide column here......
        self.setSelectionMode(self.SingleSelection) 
        self.setDragDropMode(self.InternalMove)
        self.setSelectionBehavior(self.SelectRows)

    def dragEnterEvent(self, event):
        if event.mimeData().hasFormat("application/xml-chirag"):
            event.accept()
        else:
            event.ignore()

    def dragMoveEvent(self, event):
        if event.mimeData().hasFormat("application/xml-chirag"):
            event.setDropAction(QtCore.Qt.MoveAction)
            event.accept()
        else:
            event.ignore()

    def dropEvent(self, event):
        data = event.mimeData()
        bstream = data.retrieveData("application/xml-chirag", QtCore.QVariant.ByteArray)
        selected = pickle.loads(bstream)
        index = self.indexAt(event.pos()).row()
        print("into the drop event")
        print(index)  # This is printing -1
        print(self.indexAt(event.pos()))
        self.emit(SIGNAL("casualSignal3"),selected, index)
        event.accept()

    def startDrag(self, event):
        indx = self.indexAt(event.pos())
        index = indx.row()
        print("into the drag event")
        self.emit(SIGNAL("casualSignal4"),indx, index)
        if not indx.isValid():
            pass
        else:
            return True

    def mouseMoveEvent(self, event):
        self.startDrag(event)

模型是:

class SerialTestListModel(QtCore.QAbstractListModel):

    def __init__(self, testStep = [], parent = None):
        QtCore.QAbstractListModel.__init__(self, parent)
        self.__TestSteps = testStep

    def rowCount(self, parent):
        return len(self.__TestSteps)

    def flags(self, index):
        if index.isValid():
            return QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled | QtCore.Qt.ItemIsEnabled | QtCore.Qt.MoveAction
        else:
            return QtCore.Qt.ItemIsSelectable | QtCore.Qt.ItemIsDragEnabled | QtCore.Qt.ItemIsDropEnabled  | QtCore.Qt.ItemIsEnabled

    def data(self, index, role):
        if role == QtCore.Qt.DisplayRole:
            row = index.row()
            return self.__TestSteps[row]

    def setData(self, index, value, role = QtCore.Qt.DisplayRole):
        if role == QtCore.Qt.DisplayRole:
            self.dataChanged.emit(index,index)
            return True
        return False

    def insertRows(self, position, rows, selected, parent = QtCore.QModelIndex()):

        if selected is None:
            pass
        else:
            if ((position == -1) and (selected is not None)):
                position = self.rowCount(parent)
            self.beginInsertRows(parent, position, position + rows - 1)
            for i in range(rows):
                self.__TestSteps.insert(position, selected)        
            self.endInsertRows()
            return True

    def removeRows(self, position, rows, parent = QtCore.QModelIndex()):
        if position == -1:
            pass
        else:
            self.beginRemoveRows(parent, position, position + rows - 1)
            for i in range(rows):
                value = self.__TestSteps[position]
                self.__TestSteps.remove(value)
            self.endRemoveRows()
            return True

控制器部分:

SerialTestStepListViewHdlr = CTC.SerialTestStepListView()
    SerialTestStepListViewHdlr.show()
    SerialTestStepListViewHdlr.connect(SerialTestStepListViewHdlr, SIGNAL("casualSignal3"), acceptDrag)


def acceptDrag(selected, index):
    SerialTestStepListModel = mod.SerialTestListModel(testStep)
    #selected = str(selected)
    SerialTestStepListModel.insertRows(index, 1, selected)
    SerialTestStepListViewHdlr.setModel(SerialTestStepListModel)

1 个答案:

答案 0 :(得分:2)

更换后解决了这个问题:

index = self.indexAt(event.pos()).row()

index = self.rowAt(event.pos().y())

在dropEvent()方法中。