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_())
우수함! 그것을 시도하자! 동안 주제에. listItem에 저장된 데이터는 "deepcopied"onDrop()을 가져옵니다. 그것을 무시할 수있는 방법이 있습니까? – alphanumeric
감사! Tuple리스트의 arg는 인덱스 번호를 아름답게 가져옵니다! super (ThumbListWidget, self) .dropEvent (event)에서 어떤 현상이 발생합니까? _dropping을 왜 연속으로 재설정해야합니까? 다시 한 번 감사드립니다! – alphanumeric
@Sputnix. 나는 당신의 첫 번째 코멘트를 이해하지 못한다. 'rowsInserted'는 행이 삽입 될 때마다 (drop 이벤트에만) 호출되기 때문에 잘못된 시간에 신호를 방출하는 것을 피하기 위해'_dropping' 플래그가 필요합니다. – ekhumoro