使用pyqt5拖放(SIGNAL)

时间:2017-01-12 10:12:24

标签: python drag-and-drop pyqt pyqt5 qt-designer

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

在“dropevent”中:

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

并在MainForm中:

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

我阅读了很多帖子,但似乎无法找到答案如何用pyqt5写下来。有人可以帮帮我吗?

链接到整个示例: PyQT4: Drag and drop files into QListWidget

2 个答案:

答案 0 :(得分:1)

简单。

  1. 信号必须先出现
  2. 插槽作为参数。
  3. 您必须在创建信号后才能连接
  4. 只有在建立连接后才能发光。
  5. 这里我们举一个小例子:

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

    在你的例子中,让我们说并考虑视图拥有信号,而pictureDropped是你的插槽功能,所以:

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

    请记住,您的信号必须发出某些类型或者根本不发送任何类型,并且您的@pyqtSlot函数必须接收相同类型的函数,并且该函数接收与您的信号发出相同数量的参数。

    我在不久前发了一篇关于图像拖放的文章,很难弄清楚如何接受事件以及类如何表现,它比仅仅信号更深刻,如果您需要,请 POST:D

答案 1 :(得分:1)

您的关联示例使用old-style signal and slot syntax,而您需要使用new-style syntax。在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)