【发布时间】:2014-10-25 12:33:11
【问题描述】:
这是我在这里的第一个条目,对于任何新手的错误,我们深表歉意。在发布之前,我在这里和谷歌都搜索过,但都没有运气。
我希望能够通过从文件浏览器中拖放来将图像添加到 QListWidget。在列表小部件上放置一个有效文件还需要触发我的应用程序主类中的一个函数,并将图像路径传递给它。
我发现 this code 正是这样做的,但对于 PyQt4。在触发拖放事件时,从 PySide 而不是 PyQt4 导入 QtCore 和 QtGui 会产生分段错误。没有错误消息。
我想我已经找到了一种处理信号的旧方式,并尝试使用here 描述的新的、更 Python 的方式。我似乎无法让它工作,但仍然在类之间传递一个 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()
【问题讨论】:
标签: python drag-and-drop pyqt pyside qlistwidget