2013-06-19 1 views
0

사용자가 파일을 목록보기 (또는 유사한 위젯)로 끌어다 놓을 수있는 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_()) 

답변

1

다른 플랫폼 확실하지하지만 윈도우에 복사하거나 이동할 자신의 코드를 작성할 필요가 없습니다 PyQt4.QtCore 가져 오기에서 PyQt4.QtGui 가져 오기 * 에서

수입 SYS 을 파일. 'text/uri-list'를 사용하여 mimedata에 파일 경로를 추가하면 창이 드롭 위치로 복사/이동합니다.

testFile = 'file:///C:/testFile.txt' 
md = QMimeData() 
md.setData('text/uri-list', QtCore.QByteArray(testFile)) 
+0

웃기는. 거의 4 년 후, 나는 stackoverflow에이 같은 질문을하기 위해 갔다. 나는 단지 4 년 전에 그것을 요구했지만 당신의 반응을 결코 보지 못했다. 그냥 테스트하고 잘 작동합니다. 4 년의 연기로 유감입니다. :) – panofish

관련 문제