gpt4 book ai didi

python - PySide:将文件拖放到 QListWidget 中

转载 作者:太空宇宙 更新时间:2023-11-03 12:47:52 25 4
gpt4 key购买 nike

这是我在这里的第一篇文章,对于任何新手错误,我们深表歉意。在发布之前,我已经在这里和谷歌上进行了搜索,但没有成功。

我希望能够使用文件浏览器中的拖放功能将图像添加到 QListWidget。将有效文件拖放到列表小部件上还需要在我的应用程序的主类中触发一个函数,并将图像路径传递给它。

我找到了 this code确实如此,但对于 PyQt4。从 PySide 而不是 PyQt4 导入 QtCore 和 QtGui 在触发拖放事件时会产生段错误。没有错误消息。

我想我已经将其追溯到处理信号的旧方法,并尝试使用描述的新的、更 pythonic 的方式 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()

最佳答案

最终了解了 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()

关于python - PySide:将文件拖放到 QListWidget 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25603134/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com