사용자가 파일을 목록보기 (또는 유사한 위젯)로 끌어다 놓을 수있는 PyQt 응용 프로그램을 만들고 싶습니다. 그 목록. 이것은 다음 예제에서 많이 작동합니다.PyQt : qlistview/qtablewidget/qlistwidget 항목이 드롭 된 경로를 가져옵니다. 파이썬 응용 프로그램 외부에
예를 들어 사용자가 목록보기에서 항목을 바탕 화면 (응용 프로그램의 외부/외부)으로 끌면 Python 프로그램이 항목이 삭제 된 경로 (예 : C : \ Users \ alilly \ Desktop). 그런 다음 해당 위치에 파일을 복사하는 코드를 작성할 수 있습니다.
이것은 부분적으로 작동하는 코드입니다. *
class MyListWidget(QListWidget):
def __init__(self, parent):
super(MyListWidget, self).__init__(parent)
self.setAcceptDrops(True)
self.setDragEnabled(True)
self.setDragDropMode(QAbstractItemView.InternalMove)
def mouseMoveEvent(self, event):
self.dragObject()
def dragEnterEvent(self, event):
if event.mimeData().hasUrls():
event.acceptProposedAction()
else:
super(MyListWidget, self).dragEnterEvent(event)
def dragMoveEvent(self, event):
super(MyListWidget, self).dragMoveEvent(event)
def dropEvent(self, event):
if event.mimeData().hasUrls():
for url in event.mimeData().urls():
self.addItem(url.path())
event.acceptProposedAction()
else:
super(MyListWidget,self).dropEvent(event)
def dragObject(self):
if not self.selectedIndexes(): return
drag = QDrag(self)
data = []
for index in self.selectedIndexes():
if not index.isValid(): continue
# this assumes your model has a nodeFromIndex() method -
# it's easy to set one up, you'll probably have a custom
# model class anyways
# node = self.model().nodeFromIndex(index)
# data.append(str(node))
# in this case I'm just making a newline-seperated list
# of the data, you could do pretty much anything here
md = QMimeData()
md.setData('text/plain', "\n".join(data))
# this is important. Without this, it won't do anything.
# you can use different actions like Qt.MoveAction, which
# would remove the item from your model, but then your model
# has to be more complicated. I'm only interested in copy here.
drag.setMimeData(md)
dropAction = drag.exec_(Qt.CopyAction)
class MyWindow(QWidget):
def __init__(self):
super(MyWindow,self).__init__()
self.setGeometry(100,100,300,400)
self.setWindowTitle("Filenames")
self.list = MyListWidget(self)
layout = QVBoxLayout(self)
layout.addWidget(self.list)
self.setLayout(layout)
if __name__ == '__main__':
app = QApplication(sys.argv)
app.setStyle("plastique")
window = MyWindow()
window.show()
sys.exit(app.exec_())
웃기는. 거의 4 년 후, 나는 stackoverflow에이 같은 질문을하기 위해 갔다. 나는 단지 4 년 전에 그것을 요구했지만 당신의 반응을 결코 보지 못했다. 그냥 테스트하고 잘 작동합니다. 4 년의 연기로 유감입니다. :) – panofish