使用 pyqt5 (SIGNAL) 拖放

Posted

技术标签:

【中文标题】使用 pyqt5 (SIGNAL) 拖放【英文标题】:Drag and drop with pyqt5 (SIGNAL) 【发布时间】:2017-05-27 09:30:53 【问题描述】:

我正在尝试让拖放(带有图像或文件)在 pyqt5 中为我的列表小部件工作。用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

【问题讨论】:

【参考方案1】:

简单。

    信号必须先来 插槽作为参数。 只有在信号创建后才能连接 您必须仅在建立连接后发出。

我们来看一个小例子:

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

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

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

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

不久前我发表了一篇关于图像拖放的帖子,很难弄清楚如何接受事件以及类的行为方式,它比仅信号更深一些,所以,如果你需要这里是 POST :D

【讨论】:

非常感谢您花时间回答我的问题。我要试试这个。也会查看您的帖子,很高兴了解有关信号如何工作的更多信息。 酷先生,我强烈建议你看看这个帖子,我很难弄清楚,没有人回答我,但经过一些深入的研究,我终于做到了,总结了拖放事件的一些不错的概念。即使我问自己并回答了自己,仍然值得一试:D。很高兴知道您正在努力。【参考方案2】:

您的链接示例使用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)

【讨论】:

以上是关于使用 pyqt5 (SIGNAL) 拖放的主要内容,如果未能解决你的问题,请参考以下文章

使用PyQt5拖放QLabel

将 PyQt4 代码适配到 PyQt5,SIGNAL 问题

PyQt5 TabWidget tabBarClicked TypeError: native Qt signal is not callable

PyQt5 QListView 拖放创建新的隐藏项

pyqt5中的信号槽的使用

Scrapy + pyqt5:信号仅在主线程错误中有效