'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
... 虽然实际上应该有方法 connect、disconnect 和 emit 根据 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__()
,然后就可以了
我正在将 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
... 虽然实际上应该有方法 connect、disconnect 和 emit 根据 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__()
,然后就可以了