我有一个问题。
我有两个类,A和B. A创建B类型的对象,并发出如下信号:
QtCore.QObject.emit(QtCore.SIGNAL('mySignal'), "Hello World")
B可以看到A中的方法A在创建B时将'self'作为参数传递给构造函数,如here所述。
现在,我想在B中为A中发出的信号写一个插槽,如下所示:
self.connect(self._creator, QtCore.SIGNAL('mySignal'), mySlot)
这里我想提一下A和B都继承自QtCore.QObject。 mySlot方法只是打印它从信号中接收的值作为参数。
当我运行它时,我收到此错误:
QObject.emit(SIGNAL(),...):未绑定方法的第一个参数必须具有类型'QObject'
在两个类的 init ()中,我添加了这个:
QtCore.QObject.__init__(self)
如果不添加此内容,我会收到错误:
RuntimeError:基础C / C ++对象已被删除
我没有经验Qt。我不明白出了什么问题。请帮忙。
答案 0 :(得分:1)
未绑定方法的第一个参数必须具有类型'QObject'
如错误所示,您需要为A
传递QtCore.QObject.emit
的引用或使用实例方法调用它:
QtCore.QObject.emit(self, QtCore.SIGNAL('mySignal'), "Hello World")
或者
self.emit(QtCore.SIGNAL('mySignal'), "Hello World")
完全正常的例子(如果我理解你的话):
from PyQt4 import QtCore
class A(QtCore.QObject):
mySignal = QtCore.SIGNAL('mySignal(QString)')
def __init__(self):
QtCore.QObject.__init__(self)
def create_b(self):
return B(self)
def some_action(self):
QtCore.QObject.emit(self, QtCore.SIGNAL('mySignal'), "Hello World")
# this will work too
self.emit(QtCore.SIGNAL('mySignal'), "Hello World")
class B(QtCore.QObject):
def __init__(self, creator):
QtCore.QObject.__init__(self)
self._creator = creator
self.connect(self._creator, QtCore.SIGNAL('mySignal'), self.mySlot)
def mySlot(self, str):
print str
a = A()
b = a.create_b()
a.some_action()
更好的解决方案是使用New-style Signals and Slots
以下是您的案例:
from PyQt4 import QtCore
class A(QtCore.QObject):
mySignal = QtCore.pyqtSignal(str)
def __init__(self):
QtCore.QObject.__init__(self)
def create_b(self):
return B(self)
def some_action(self):
self.mySignal.emit("Hello World")
class B(QtCore.QObject):
def __init__(self, creator):
QtCore.QObject.__init__(self)
self._creator = creator
self._creator.mySignal.connect(self.mySlot)
def mySlot(self, str):
print str
a = A()
b = a.create_b()
a.some_action()