2016-05-28 18 views
3

です。私のコードでは、ドラッグアンドドロップを1つのQListViewから別のQListViewに実装しています。 今、必要性のために、私はドロップを受け入れるビューを変更しました。つまり、代わりにQListViewからQTableViewにドラッグしようとしています。PyQt:リストビューからアイテムをドラッグしてテーブルビューにドロップすると、ドロップインデックスは常に-1

私は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 

コントローラ一部:

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

をdropEvent()メソッドで

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

で:

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) 

答えて

2

はこれを交換した後に解決しました。

関連する問題