Сигнал-слот Связь между Создателем и Созданным Классом - PullRequest
0 голосов
/ 05 февраля 2012

У меня есть вопрос.

У меня есть два класса, A и B. A создает объект типа B, а также излучает сигналы, подобные этому:

QtCore.QObject.emit(QtCore.SIGNAL('mySignal'), "Hello World")

B может видеть методыв A как A передал 'self' в качестве аргумента конструктору при создании B, как описано здесь .

Теперь я хочу написать слот в 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 Ответ

1 голос
/ 05 февраля 2012

первый аргумент несвязанного метода должен иметь тип '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()

Еще лучшее решение - использовать Сигналы и слоты нового стиля

Вот пример для вашего случая:

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()
...