Может ли сигнал QtCore быть установлен для текущего класса?

Я пытаюсь использовать QtCore.Signal отправить новый экземпляр класса родителю объекта. То, что я пытаюсь сделать, заключается в следующем, но терпит неудачу с:

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)

похоже, исправляет ошибку, но я не уверен, что это правильный способ сделать что-то подобное, кроме того, что это, вероятно, не лучший способ сделать то, что я делаю.

1 ответ

Решение

Типичным способом сделать это было бы определить сигнал как

mySignal = QtCore.Signal(object)

так как вы хотите создать экземпляр класса.

РЕДАКТИРОВАТЬ: Если вы хотите обойти циклическую зависимость, вы можете поместить свой сигнал в класс оболочки. Например

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)
Другие вопросы по тегам