1 回答
TA贡献1853条经验 获得超18个赞
使用SIGNAL()
宏多年来一直被认为是过时的,并且“新样式”信号和槽语法必须始终用于新代码。
此外,SIGNAL 语法应该始终有一个(可能为空)参数类型列表作为其签名。PyQt 过去支持所谓的“短路信号”,它允许将没有正确签名的自定义信号连接到 python 可调用对象,并且可以发出具有任意数量和类型参数的信号。通过使用不带括号的信号可以实现这一点。
如前所述,此语法已过时,并且 pyside 还删除了对这些短路信号的支持,如PySide 和 PyQt 之间的差异页面中所述:
由于这是一个旧的且已弃用的功能,并且修复此问题的努力不值得,因此我们决定不实现它。在 PySide 代码中,您需要使用类似以下内容:
self.emit(SIGNAL ('text_changed_cb(QString)'), text)
在你的情况下,由于你没有使用参数,所以它应该是这样的:
self.connect(self.ui.DragDropEncode, SIGNAL("dropped()"), self.add_file)
但是,如前所述,这是一个古老且已弃用的功能(而且也太冗长且不太Pythonic)。
解决方案是为类创建信号并直接发出它们:
class DragDropWidget(QWidget):
dropped = Signal(str)
# ...
def dropEvent(self, event):
# ...
self.dropped.emit(url)
然后将实例的信号连接到插槽:
self.ui.DragDropEncode.dropped.connect(self.add_file)
请注意,发出信号时必须遵守参数签名。在上面的情况下,根据您的代码,我假设您将 mimeData 的 QUrl 转换为字符串。如果您需要发出 QUrl,信号必须反映:
class DragDropWidget(QWidget):
dropped = Signal(QUrl)
或者,有两种可能性:您可以使用允许发出任何类型的参数 ( ) 的通用 签名,或使用信号重载。在这种情况下,您可以使用能够发出各种参数长度和类型的单个信号。在这种情况下,将使用第一个重载作为默认值,而其他重载必须用方括号选择:objectdropped = Signal(object)emit
class DragDropWidget(QWidget):
dropped = Signal([str], [QUrl])
# ...
def dropEvent(self, event):
# ...
url = event.mimeData().urls()[0]
self.dropped.emit(url.toLocalFile())
self.dropped[QUrl].emit(url)
如果您需要根据信号签名连接到不同的插槽,这会很有用:
self.ui.DragDropEncode.dropped.connect(self.function_that_uses_strings)
self.ui.DragDropEncode.dropped[QUrl].connect(self.function_that_uses_urls)
添加回答
举报