创建者和创建的类之间的信号槽连接

时间:2012-02-05 13:24:55

标签: python pyqt pyqt4 python-2.7 signals-slots

我有一个问题。

我有两个类,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。我不明白出了什么问题。请帮忙。

1 个答案:

答案 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()