首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >self.connect()与QMainWindow.connect()

self.connect()与QMainWindow.connect()
EN

Stack Overflow用户
提问于 2014-01-22 16:18:06
回答 2查看 3.8K关注 0票数 0

作为pyQT4 SIGNALSLOT的新手,我意识到在我所有的简单案例中,<class>.connect(...)self.connect(...)实际上没有区别,这意味着两者都做我想做的事情。最简单的情况是连接QWindow的按钮,如问题标题中的按钮。

有什么不同吗?有人能给我解释一下吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-22 19:10:05

您所引用的connect方法实际上是QObject.connect,这是一个静态方法。因此,如果您直接在QObject的实例或子类上或在QObject上调用它,这并不重要。

那就是说,不要用它。

最好使用信号的连接方法来代替:

代码语言:javascript
复制
qobject_instance.signal_name.connect(slot_or_callable)

这被称为“新型信号”,它是PyQt4中连接信号的首选方式。

在PyQt5中,旧的样式信号甚至完全消失了,这意味着QObject.connect不再存在,您必须使用新的样式信号。

票数 1
EN

Stack Overflow用户

发布于 2014-01-22 19:13:20

应避免使用信号和插槽。虽然这种类型的连接信号在PyQt4中仍然支持,但在PyQt5中根本不支持。

相反,您应该尽可能地使用新型语法。与旧风格的语法相比,新风格的语法更具可读性,更容易出错.

为了说明两者之间的区别,请考虑以下QTreeWidget信号

QTreeWidgetItem::currentItemChanged( QTreeWidgetItem * current,QTreeWidgetItem*QTreeWidgetItem)信号

使用旧风格的语法,在PyQ4中可以将其翻译为:

代码语言:javascript
复制
    self.connect(self.treewidget, QtCore.SIGNAL(
        'currentItemChanged(QTreeWidgetItem *, QTreeWidgetItem *)'),
        self.handleCurrentChanged)

但是,使用新的样式语法可以是:

代码语言:javascript
复制
   self.treewidget.currentItemChanged.connect(self.handleCurrentChanged)

它立刻变得更简单、更清晰,并使人们清楚地看到,什么是与什么有关的,以及如何联系的。

更好的是,它不那么容易出错。如果您的新样式连接出错,它总是会引发错误。使用旧的语法,如果SIGNAL的字符串参数稍有错误,连接就会悄悄地失败,这使调试变得非常尴尬。

PS:

如果使用pyuic4将设计器ui文件转换为python模块,则生成的代码将使用旧的样式语法。这是不幸的,但显然必须这样做,因为向后兼容的原因。这并不意味着这是用手工编写的PyQt代码进行操作的“正确”方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21288268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档