作为pyQT4 SIGNAL和SLOT的新手,我意识到在我所有的简单案例中,<class>.connect(...)和self.connect(...)实际上没有区别,这意味着两者都做我想做的事情。最简单的情况是连接QWindow的按钮,如问题标题中的按钮。
有什么不同吗?有人能给我解释一下吗?
发布于 2014-01-22 19:10:05
您所引用的connect方法实际上是QObject.connect,这是一个静态方法。因此,如果您直接在QObject的实例或子类上或在QObject上调用它,这并不重要。
那就是说,不要用它。
最好使用信号的连接方法来代替:
qobject_instance.signal_name.connect(slot_or_callable)这被称为“新型信号”,它是PyQt4中连接信号的首选方式。
在PyQt5中,旧的样式信号甚至完全消失了,这意味着QObject.connect不再存在,您必须使用新的样式信号。
发布于 2014-01-22 19:13:20
应避免使用信号和插槽。虽然这种类型的连接信号在PyQt4中仍然支持,但在PyQt5中根本不支持。
相反,您应该尽可能地使用新型语法。与旧风格的语法相比,新风格的语法更具可读性,更容易出错.
为了说明两者之间的区别,请考虑以下QTreeWidget信号
QTreeWidgetItem::currentItemChanged( QTreeWidgetItem * current,QTreeWidgetItem*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代码进行操作的“正确”方法。
https://stackoverflow.com/questions/21288268
复制相似问题