可以将 QtCore 信号设置为当前 class 吗?

Can a QtCore Signal be set to the current class?

我正在尝试使用 QtCore.Signal 将 class 的新实例发送到对象的父对象。 我正在尝试做的事情如下,但失败了:

NameError: name 'myClass' is not defined

class myClass(QtGui.QMainWindow):
    mySignal = QtCore.Signal(myClass)
    def __init__(self, parent=None):
        super(myClass, self).__init__(parent)

    def create_new_self(self):
        newSelf = myClass(self.parent())
        self.mySignal.emit(newSelf)

class myParentClass(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(myParentClass, self).__init__(parent)
        myNewClass = myClass(self)
        myNewClass.mySignal.connect(self.handle_my_signal)

    @QtCore.Slot(myClass)
    def handle_my_signal(self, newMyClass):
        newMyClass.mySignal.connect(self.handle_my_signal)
        self.listOfClasses.append(newMyClass)

通过更改行:

mySignal = QtCore.Signal(myClass)

mySignal = QtCore.Signal(QtGui.QMainWindow)

似乎修复了错误,但我不确定这是否是执行此类操作的正确方法,除了它可能不是执行我正在做的事情的最佳方法。

执行此操作的典型方法是将信号定义为

mySignal = QtCore.Signal(object)

因为您希望发出 class.

的实例

编辑:如果你想解决循环依赖,你可以把你的信号放在一个包装器中class。例如

class myClass(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super(myClass, self).__init__(parent)
        # Note: argument of "self" is to parent the object
        self.signalwrapper = MyWrapper(self)

    def create_new_self(self):
        newSelf = myClass(self.parent())
        self.signalwrapper.mySignal.emit(newSelf)

class MyWrapper(QtCore.QObject):
    mySignal = QtCore.Signal(myClass)