使用 pyqt5 拖放(SIGNAL)

Drag and drop with pyqt5 (SIGNAL)

我正在尝试在 pyqt5 中为我的 listwidget 拖放(带有图像或文件)。我可以找到很多使用 pyqt4 的示例,但是有一部分在较新版本中不起作用:

在"dropevent"中:

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

并在 MainForm 中:

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

我读了很多帖子,但似乎找不到如何用 pyqt5 写下来的答案。谁能帮我解决这个问题?

link 整个例子: PyQT4: Drag and drop files into QListWidget

简单。

  1. 信号必须先到
  2. 插槽作为参数。
  3. 您必须在创建信号后才能连接
  4. 只有在建立连接后才能发出。

举个小例子:

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

在您的示例中,假设视图拥有信号并且 pictureDropped 是您的槽函数,因此:

self.view.dropped.connect(self.pictureDropped)

请记住,您的信号必须发出特定类型或什么都不发出,并且您的@pyqtSlot 函数必须接收相同的类型,并且该函数接收与您的信号发出的参数数量相同的参数.

不久前我做了一个post关于图像拖放的文章,在弄清楚如何接受事件以及如何类 表现,它比信号更深一点所以,如果你需要这里是 :D

您的链接示例使用 old-style signal and slot syntax, whereas you need to use the new-style syntax。在 PyQt4(4.5 或更高版本)中,您可以使用任何一种样式,但 PyQt5 仅支持新样式。

old-style 语法允许发出自定义信号 on-the-fly,但 new-style 语法要求事先在 class 上声明信号:

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)