2014-04-11 2 views
1

이 예제는 두 개의 끌어서 놓기가 가능한 listWidgets (thanks ekhumoro!)가있는 간단한 대화 상자 창을 생성합니다. dropEvent에서 droppedOnA() 및 droppedOnB() 함수는 항목을 가져온 listWidgets과 이전에 사용한 색인을 표시합니다. 그러나 나는 그들이 QListWidget 리시버에 놓인 후에 할당 된 삭제 된 listItems를 인덱스 화하는 것을 찾아야한다. 이것을 달성하는 방법을 설명하면 감사하겠습니다.PyQt : ListView의 onDrop() 후 listItem 인덱스를 얻는 방법

from PyQt4 import QtGui, QtCore 
import sys, os 

class MyClass(object): 
     def __init__(self): 
      super(MyClass, self).__init__()    

class ThumbListWidget(QtGui.QListWidget): 
    _drag_info = [] 
    def __init__(self, type, name, parent=None): 
     super(ThumbListWidget, self).__init__(parent) 
     self.setObjectName(name) 
     self.setIconSize(QtCore.QSize(124, 124)) 
     self.setDragDropMode(QtGui.QAbstractItemView.DragDrop) 
     self.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) 
     self.setAcceptDrops(True) 

    def startDrag(self, actions): 
     self._drag_info[:] = [str(self.objectName())] 
     for item in self.selectedItems(): 
      self._drag_info.append(self.row(item)) 
     super(ThumbListWidget, self).startDrag(actions) 

    def dragEnterEvent(self, event): 
     if event.mimeData().hasUrls(): 
      event.accept() 
     else: 
      super(ThumbListWidget, self).dragEnterEvent(event) 

    def dragMoveEvent(self, event): 
     if event.mimeData().hasUrls(): 
      event.setDropAction(QtCore.Qt.CopyAction) 
      event.accept() 
     else: 
      super(ThumbListWidget, self).dragMoveEvent(event) 

    def dropEvent(self, event): 
     if event.mimeData().hasUrls(): 
      event.setDropAction(QtCore.Qt.CopyAction) 
      event.accept() 
      links = [] 
      for url in event.mimeData().urls(): 
       links.append(str(url.toLocalFile())) 
      self.emit(QtCore.SIGNAL("dropped"), links) 
     else: 
      # event.setDropAction(QtCore.Qt.MoveAction) 
      super(ThumbListWidget, self).dropEvent(event) 
      self.emit(QtCore.SIGNAL("dropped"), self._drag_info) 


class Dialog_01(QtGui.QMainWindow): 
    def __init__(self): 
     super(QtGui.QMainWindow,self).__init__() 
     self.listItems={} 

     myQWidget = QtGui.QWidget() 
     myBoxLayout = QtGui.QVBoxLayout() 
     myQWidget.setLayout(myBoxLayout) 
     self.setCentralWidget(myQWidget) 

     self.listWidgetA = ThumbListWidget(self, 'MainTree') 
     self.listWidgetB = ThumbListWidget(self, 'SecondaryTree') 

     for i in range(7): 
      listItemA=QtGui.QListWidgetItem() 
      listItemA.setText('A'+'%04d'%i) 
      self.listWidgetA.addItem(listItemA) 

      myClassInstA=MyClass() 
      listItemA.setData(QtCore.Qt.UserRole, myClassInstA) 

      listItemB=QtGui.QListWidgetItem() 
      listItemB.setText('A'+'%04d'%i) 
      self.listWidgetB.addItem(listItemB) 

      myClassInstB=MyClass() 
      listItemB.setData(QtCore.Qt.UserRole, myClassInstB) 

     myBoxLayout.addWidget(self.listWidgetA)  

     myBoxLayout.addWidget(self.listWidgetB) 
     self.connect(self.listWidgetA, QtCore.SIGNAL("dropped"), self.droppedOnA) 
     self.connect(self.listWidgetB, QtCore.SIGNAL("dropped"), self.droppedOnB) 


    def droppedOnA(self, dropped_list): 
     print '\n\t dropped On MainTree', dropped_list, 

    def droppedOnB(self, dropped_list): 
     print '\n\t dropped On SecondaryTree', dropped_list 


if __name__ == '__main__': 
    app = QtGui.QApplication(sys.argv) 
    dialog_1 = Dialog_01() 
    dialog_1.show() 
    dialog_1.resize(720,480) 
    sys.exit(app.exec_()) 

답변

2

는 파괴 시험,하지만 rowsInserted을 재 구현하고 거기에서 dragInfo를 방출하지 :

class ThumbListWidget(QtGui.QListWidget): 
    _drag_info = [] 
    def __init__(self, type, name, parent=None): 
     ... 
     self._dropping = False 

    def dropEvent(self, event): 
     if event.mimeData().hasUrls(): 
      event.setDropAction(QtCore.Qt.CopyAction) 
      event.accept() 
      links = [] 
      for url in event.mimeData().urls(): 
       links.append(str(url.toLocalFile())) 
      self.emit(QtCore.SIGNAL("dropped"), links) 
     else: 
      # event.setDropAction(QtCore.Qt.MoveAction) 
      self._dropping = True 
      super(ThumbListWidget, self).dropEvent(event) 
      self._dropping = False 

    def rowsInserted(self, parent, start, end): 
     if self._dropping: 
      self._drag_info.append((start, end)) 
      self.emit(QtCore.SIGNAL("dropped"), self._drag_info) 
     super(ThumbListWidget, self).rowsInserted(parent, start, end) 
+0

우수함! 그것을 시도하자! 동안 주제에. listItem에 저장된 데이터는 "deepcopied"onDrop()을 가져옵니다. 그것을 무시할 수있는 방법이 있습니까? – alphanumeric

+0

감사! Tuple리스트의 arg는 인덱스 번호를 아름답게 가져옵니다! super (ThumbListWidget, self) .dropEvent (event)에서 어떤 현상이 발생합니까? _dropping을 왜 연속으로 재설정해야합니까? 다시 한 번 감사드립니다! – alphanumeric

+0

@Sputnix. 나는 당신의 첫 번째 코멘트를 이해하지 못한다. 'rowsInserted'는 행이 삽입 될 때마다 (drop 이벤트에만) 호출되기 때문에 잘못된 시간에 신호를 방출하는 것을 피하기 위해'_dropping' 플래그가 필요합니다. – ekhumoro

관련 문제