'PySide.QtCore.Signal' 对象没有属性 'connect'

'PySide.QtCore.Signal' object has no attribute 'connect'

我正在将 Python 3.4 与 Pyside 1.2.4 和 PyQt 4.8.7 一起使用,当我尝试将信号连接到插槽时,它显示:

'PySide.QtCore.Signal' object has no attribute 'connect'

我正在使用 MVC:

型号:

from PySide.QtCore import Signal
class Model(object):

    def __init__(self):
        self.updateProgress = Signal(int)

控制器:

class Controller(QWidget):
"""
MVC Pattern: Represents the controller class

"""
def __init__(self, parent=None):
    super().__init__(parent)
    self.model = Model()
    self.model.updateProgress.connect(self.setProgress)

当我在 Pycharm 中查找 Class 时,按住 CTRL 并单击信号 class,它看起来如下所示:

class Signal(object):
""" Signal """
def __call__(self, *args, **kwargs): # real signature unknown
    """ Call self as a function. """
    pass

def __getitem__(self, *args, **kwargs): # real signature unknown
    """ Return self[key]. """
    pass

def __init__(self, *args, **kwargs): # real signature unknown
    pass

@staticmethod # known case of __new__
def __new__(*args, **kwargs): # real signature unknown
    """ Create and return a new object.  See help(type) for accurate signature. """
    pass

def __str__(self, *args, **kwargs): # real signature unknown
    """ Return str(self). """
    pass

... 虽然实际上应该有方法 connectdisconnectemit 根据 PySide 文档,可在以下位置找到:

https://srinikom.github.io/pyside-docs/PySide/QtCore/Signal.html#PySide.QtCore.Signal.connect

提前感谢您的帮助

必须在 class 而非实例上定义信号。 class 必须是 QObject 的子 class,或者是 class 的混入。所以:

class Model(QtCore.QObject):
    updateProgress = Signal(int)

或:

class Mixin(object):
    updateProgress = Signal(int)

class Model(Mixin, QtCore.QObject):
    pass

除了ekhumoro的回答,有信号的class还需要调用super().__init__()。忘记这样做会导致同样的错误。

class Model(QtCore.QObject):
    updateProgress = Signal(int)

    def __init__(self):
        super().__init__()  # This is required!
        # Other initialization...

具体工作示例:

class QWorker(QRunnable, QObject):
    started = Signal()
    finished = Signal()
    failed = Signal()

    def __init__(self, fn, *args, **kwargs):
        QObject.__init__(self)
        QRunnable.__init__(self)

        self.fn = fn
        self.args = args
        self.kwargs = kwargs

    def run(self):
        self.started.emit()
        try:
            self.fn(*self.args, **self.kwargs)
        except BaseException as e:
            self.failed.emit()
        else:
            self.finished.emit()

有趣的是,你必须执行QObject.__init__(self)
而不是 super(QObject, self).__init__(),然后就可以了