使用PyQt5实现拖放功能(SIGNAL)

6

我正在尝试在pyqt5中让我的listwidget支持拖放(包括图像或文件)。我能找到很多pyqt4的示例,但在新版本中有一部分无法工作:

在“dropevent”中:

self.emit(QtCore.SIGNAL("dropped"), links)

在主窗体中:

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

我看了很多帖子,但似乎找不到一个关于如何使用pyqt5的答案。有人能帮我吗?
完整示例链接: PyQT4: Drag and drop files into QListWidget
2个回答

2
简单。
  1. 信号必须先创建
  2. 将插槽作为参数传递。
  3. 连接必须在信号创建之后进行
  4. 只有在连接建立之后才能发出信号。

下面是一个小例子:

self.signalOwner.mySignal.connect(self.slotFunction)

在您的示例中,假设并考虑视图拥有信号,并且pictureDropped是您的插槽函数,因此:
self.view.dropped.connect(self.pictureDropped)

记住,你的信号必须发出特定类型或完全不发出,并且你的@pyqtSlot函数必须接收与接收信号相同数量的参数相同类型。
我之前发布了一篇关于拖放图像的文章,花了很多时间才弄清楚如何接受事件以及类的行为,这比仅仅处理信号要深入一些,如果需要,这是POST。 :D

非常感谢您抽出时间回答我的问题。我将尝试这个方法。我也会查看您的帖子,很高兴了解更多关于信号如何工作的知识。 - user7409069
先生,我强烈建议您查看这篇文章,我曾经花了很多时间来尝试解决它,没有人回答我,但是经过深入的研究,我终于实现了它,并总结了一些关于拖放事件的好概念。即使我自己提出问题并回答了自己,仍然值得一看:D。很高兴知道您正在努力尝试。 - yurisnm

2
你链接的示例使用了旧式信号槽语法,而你需要使用新式语法。在 PyQt4(4.5 版本或更高版本)中,你可以使用任一语法,但 PyQt5 仅支持新式语法。
旧式语法允许在运行时自定义发射信号,但新式语法要求在类上先声明该信号:
class ListWidget(QtWidgets.QListWidget):
    dropped = QtCore.pyqtSignal(list)

    def __init__(self, parent=None):
        ...

    def dropEvent(self, event):
        ...
        self.dropped.emit(list_of_files)

然后进行信号连接,方法如下:
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        ...
        self.listWidget = ListWidget()
        self.listWidget.dropped.connect(self.handleDropped)

    def handleDropped(self, list_of_files):
        print('dropped:', list_of_files)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接