2014-09-01 3 views
3

이것은 초보자를위한 사과의 첫 번째 항목입니다. 게시하기 전에 여기에서 Google과 Google을 모두 검색했습니다.PySide : 파일을 QListWidget에 드래그 앤 드롭

파일 브라우저에서 드래그 앤 드롭을 사용하여 이미지를 QListWidget에 추가하고 싶습니다. 목록 위젯에서 유효한 파일을 삭제하면 내 앱의 기본 클래스에서 함수를 트리거하고 이미지 경로를 전달해야합니다.

정확하게는 그렇지만, PyQt4의 경우는 this code입니다. PyQt4 대신 PySide에서 QtCore 및 QtGui를 가져 오면 드래그 앤 드롭 이벤트를 트리거 할 때 세그멘테이션 오류가 발생합니다. 오류 메시지가 없습니다.

나는 이것을 시그널을 다루는 옛 방식으로 추적했고, 새로운, 좀 더 비유적인 방법을 사용하여 시도했다고 생각한다. here. 그러나 클래스간에 URL 목록을 전달하는 동안 작동하지 않는 것처럼 보입니다.

도움이 될 것입니다.

import sys 
import os 
from PyQt4 import QtGui, QtCore 

class TestListView(QtGui.QListWidget): 
    def __init__(self, type, parent=None): 
     super(TestListView, self).__init__(parent) 
     self.setAcceptDrops(True) 
     self.setIconSize(QtCore.QSize(72, 72)) 

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

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

    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.ignore() 

class MainForm(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainForm, self).__init__(parent) 

     self.view = TestListView(self) 
     self.connect(self.view, QtCore.SIGNAL("dropped"), self.pictureDropped) 
     self.setCentralWidget(self.view) 

    def pictureDropped(self, l): 
     for url in l: 
      if os.path.exists(url): 
       print(url)     
       icon = QtGui.QIcon(url) 
       pixmap = icon.pixmap(72, 72)     
       icon = QtGui.QIcon(pixmap) 
       item = QtGui.QListWidgetItem(url, self.view) 
       item.setIcon(icon)   
       item.setStatusTip(url)   

def main(): 
    app = QtGui.QApplication(sys.argv) 
    form = MainForm() 
    form.show() 
    app.exec_() 

if __name__ == '__main__': 
    main() 

답변

7

마지막으로 PySide 신호가 어떻게 작동하는지 알아 냈습니다. 위의 PyQt4 코드는 PySide로 이식되었습니다. 거기에 더 좋은 솔루션이 있다면 듣고 싶습니다.

import sys 
import os 
from PySide import QtGui, QtCore 

class TestListView(QtGui.QListWidget): 

    fileDropped = QtCore.Signal(list) 

    def __init__(self, type, parent=None): 
     super(TestListView, self).__init__(parent) 
     self.setAcceptDrops(True) 
     self.setIconSize(QtCore.QSize(72, 72)) 

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

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

    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.fileDropped.emit(links) 
     else: 
      event.ignore() 

class MainForm(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     super(MainForm, self).__init__(parent) 

     self.view = TestListView(self) 
     self.view.fileDropped.connect(self.pictureDropped) 
     self.setCentralWidget(self.view) 

    def pictureDropped(self, l): 
     for url in l: 
      if os.path.exists(url): 
       print(url)     
       icon = QtGui.QIcon(url) 
       pixmap = icon.pixmap(72, 72)     
       icon = QtGui.QIcon(pixmap) 
       item = QtGui.QListWidgetItem(url, self.view) 
       item.setIcon(icon)   
       item.setStatusTip(url)   

def main(): 
    app = QtGui.QApplication(sys.argv) 
    form = MainForm() 
    form.show() 
    app.exec_() 

if __name__ == '__main__': 
    main()