PyQt4.QtCore.pyqtSignal对象没有属性'connect'

Dan*_*sen 52 signals pyqt pyqt4

在我制作的课程中,我遇到了自定义信号的问题.

相关代码:

self.parse_triggered = QtCore.pyqtSignal()

def parseFile(self):
    self.emit(self.parse_triggered)
Run Code Online (Sandbox Code Playgroud)

这两个属于类:RefreshWidget.在它的父类我有:

self.refreshWidget.parse_triggered.connect(self.tabWidget.giveTabsData())
Run Code Online (Sandbox Code Playgroud)

当我尝试运行该程序时,我收到错误:

AttributeError: 'PyQt4.QtCore.pyqtSignal' object has no attribute 'connect'
Run Code Online (Sandbox Code Playgroud)

救命?提前致谢.

Joe*_*gen 102

我和你有同样的问题.

试着移动

self.parse_triggered = QtCore.pyqtSignal()
Run Code Online (Sandbox Code Playgroud)

超出你的构造函数但在你的类声明中.所以不是看起来像这样:

class Worker(QtCore.QThread):
    def __init__(self, parent = None):
        super(Worker, self).__init__(parent)

        self.parse_triggered = QtCore.pyqtSignal()
Run Code Online (Sandbox Code Playgroud)

它应该如下所示:

class Worker(QtCore.QThread):
    parse_triggered = QtCore.pyqtSignal()

    def __init__(self, parent = None):
        super(Worker, self).__init__(parent)
Run Code Online (Sandbox Code Playgroud)

这可能不是你想要的,但它对我有用.我无论如何都切换回旧式信号,因为我没有在新式信号中找到一种方法来获得未定义的数字或类型的参数.

  • 有人可以解释为什么会这样吗? (47认同)
  • 这是因为PyQt库内部实现了`pyqtSignal`的方式.具体来说,在[支持信号和插槽](http://pyqt.sourceforge.net/Docs/PyQt5/signals_slots.html)下,我们发现该库可以区分未绑定和绑定的信号.神奇的表现如下:"一个信号(特别是一个未绑定的信号)是一个类的属性,它是一个`QObject`的子类.当一个信号被引用作为该类实例的属性时,PyQt5会自动将实例绑定到信号以创建绑定信号." (15认同)
  • 这有一个问题.信号将在每个实例之间共享. (9认同)
  • [此](/sf/answers/1052350491/)答案解释了为什么信号不在实例之间共享,如上面@ken-kinder所述:类属性的类型为`<unbound PYQT_SIGNAL QString)>`而实例属性的类型为“<bound PYQT_SIGNAL event>” (2认同)

boo*_*chk 65

如果您未能调用super()QObject.__init__()在自定义类中,也会收到该错误消息.

用于在Python中的Qt中定义类中的自定义信号的清单:

  • 你的类派生自QObject(直接或间接)
  • 你的班级__init__电话super()(或QObject.__init__()直接打电话.)
  • 您的信号被定义为类变量,而不是实例变量
  • 你的信号的签名(形式参数)的任何缝隙,你将连接到信号例如签名匹配()(int)(str)((int,), (str,))


小智 10

我最近开始使用PySide(诺基亚自己的PyQt版本),并看到了与自定义新式信号完全相同的行为(和解决方案).我对该解决方案的最大担心是,当我有该类的多个实例(在我的情况下是QThreads)时,使用类变量来保存信号会搞砸.

从我所看到的,QtCore.QObject.__init__(self)在类中找到Signal变量并为该实例创建该Signal的副本.我不知道该怎么QObject.__init__()做,但由此产生的信号也正确connect(),disconnect()emit()方法(也是一个__getitem__()方法),而类信号或创建一个QObject派生类之外没有这些方法和独立的信号变量不能使用正常.


Lok*_*nou 6

要使用信号/插槽系统,您需要有一个 QObject 继承类。

这是一个简单的例子:



    from PySide import QtCore
    class LivingBeing(QtCore.QObject):
      bornSignal = QtCore.Signal() # initialise our signal

      def __init__(self,name):
        QtCore.QObject.__init__(self) # initialisation required for object inheritance
        self.bornSignal.connect(self.helloWorld) # connect the born signal to the helloworld function
        self.name = name #
        self.alive = False

      def summonFromClay(self):
        self.alive = True
        self.bornSignal.emit() # emit the signal

      def helloWorld(self):
         print "Hello World !, my name is %s, this place is so great !" % self.name

    # now try the little piece of code
    if __name__ == '__main__':
      firstHuman = LivingBeing('Adam')
      firstHuman.summonFromClay()

 


小智 6

我有同样的问题。我忘记了,如果一个类使用信号,那么它必须继承自 QObject。我当时正在做一些重构,并没有注意到这一点。