以pyQT4 SIGNAL
和SLOT
作为新手玩,我意识到在所有简单的情况下,<class>.connect(...)
和self.connect(...)
之间实际上没有区别,这意味着做我想做的。
最简单的情况是连接QWindow的Button,就像问题的标题一样。
有没有区别,有人可以向我解释一下吗?
答案 0 :(得分:2)
应避免使用SIGNAL和SLOT。尽管PyQt4仍然支持这种连接信号,但在PyQt5中它根本不受支持。
相反,您应该尽可能使用new-style syntax。与旧式语法相比,新式语法更易读,更不容易出错。
为了说明差异,请考虑这个QTreeWidget signal:
void QTreeWidget :: currentItemChanged(QTreeWidgetItem * current, QTreeWidgetItem *上一页)[信号]
使用旧式语法,在PyQ4中它可以翻译为:
self.connect(self.treewidget, QtCore.SIGNAL(
'currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)'),
self.handleCurrentChanged)
但使用新式语法可能是:
self.treewidget.currentItemChanged.connect(self.handleCurrentChanged)
立即变得更加简单和清晰,并且明确了与什么相关的内容以及如何与之相关联。
更好的是,它更不容易出错。如果你的新式连接错误,它将始终引发错误。使用旧式语法,如果SIGNAL
的字符串参数稍有错误,则连接将无提示失败,从而使调试变得非常麻烦。
PS:
如果使用pyuic4
将设计器ui文件转换为python模块,则生成的代码将使用旧式语法。这很不幸,但出于向后兼容的原因,显然必须以这种方式完成。这并不意味着这是用手写的PyQt代码做事的“正确”方式。
答案 1 :(得分:1)
您所引用的connect
方法是实际QObject.connect
,这是一种静态方法。因此,如果您在QObject的实例或子类或直接在QObject上调用它并不重要。
那就是说,不要使用它。
最好使用信号的连接方法:
qobject_instance.signal_name.connect(slot_or_callable)
这被称为"new style signals",它是在PyQt4中连接信号的首选方式。
在PyQt5中,旧式信号甚至完全消失,这意味着QObject.connect
不再存在,并且必须使用新的样式信号。