使用 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 TabWidget tabBarClicked TypeError: native Qt signal is not callable