이것은 초보자를위한 사과의 첫 번째 항목입니다. 게시하기 전에 여기에서 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()