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

时间:2010-06-03 22:42:10

标签: pyqt signals pyqt4

我在上课时遇到自定义信号问题。

相关代码:

self.parse_triggered = QtCore.pyqtSignal()

def parseFile(self):
    self.emit(self.parse_triggered)

这两个属于类:RefreshWidget。 在我的父类中,我有:

self.refreshWidget.parse_triggered.connect(self.tabWidget.giveTabsData())

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

AttributeError: 'PyQt4.QtCore.pyqtSignal' object has no attribute 'connect'

帮助? 提前谢谢。

6 个答案:

答案 0 :(得分:93)

我和你有同样的问题。

尝试移动

self.parse_triggered = QtCore.pyqtSignal()

从你的构造函数中但在你的类声明中。所以不要看起来像这样:

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

        self.parse_triggered = QtCore.pyqtSignal()

它应该是这样的:

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

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

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

答案 1 :(得分:64)

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

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

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

答案 2 :(得分:10)

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

从我所看到的情况来看,QtCore.QObject.__init__(self)在类中找到Signal变量,并为该实例创建该Signal的副本。我不知道QObject.__init__()做了什么,但结果信号做了正确的connect()disconnect()emit()方法(以及__getitem__()方法),而class在QObject派生类之外创建的信号或独立信号变量没有这些方法,无法正常使用。

答案 3 :(得分:4)

要使用信号/槽系统,您需要有一个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()

 

答案 4 :(得分:3)

我遇到了同样的问题。 我忘了如果一个类使用Signals,那么它必须从QObject继承。我正在做一些重新考虑,并没有注意到这一点。

答案 5 :(得分:-1)

为什么你可以直接连接信号 self.connect(widget, SIGNAL('parse_triggered()'), listener.listening_method)

其中self是表单本身,可能与监听器

相同