【问题标题】:PyQt: Dragging item from list view and dropping to table view, the drop index is always -1PyQt:将项目从列表视图拖放到表格视图,拖放索引始终为-1
【发布时间】:2016-05-28 07:17:05
【问题描述】:

在我的代码中,我已经成功实现了从一个 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)

【问题讨论】:

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


    【解决方案1】:

    更换后解决:

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

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

    在 dropEvent() 方法中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 2013-09-18
      • 2011-07-23
      • 1970-01-01
      • 2010-10-04
      • 1970-01-01
      相关资源
      最近更新 更多