self.connect()vs QMainWindow.connect()

时间:2014-01-22 16:18:07

标签: python pyqt4

以pyQT4 SIGNALSLOT作为新手玩,我意识到在所有简单的情况下,<class>.connect(...)self.connect(...)之间实际上没有区别,这意味着做我想做的。 最简单的情况是连接QWindow的Button,就像问题的标题一样。

有没有区别,有人可以向我解释一下吗?

2 个答案:

答案 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不再存在,并且必须使用新的样式信号。