Проблема с сигналами PyQt5, испускаемыми другими классами

В приведенном ниже примере я хочу отправить сигнал от A к Main и от B к Main. Прием сигнала от A в порядке, но B не работает. Сложность заключается в том, что «вычисления» в B должны запускаться из A, а не из Main. Будем признательны за любую помощь.

Главный:

import sys

from PyQt5.QtCore import pyqtSlot, QObject
from PyQt5.QtWidgets import QApplication

from A import A
from B import B


class Main(QObject):
    def __init__(self):
        super(Main, self).__init__()
        self.a = A()
        self.b = B()
        self.a.msg.connect(self.show_message)
        self.b.msg.connect(self.show_message)

    @pyqtSlot(str)
    def show_message(self, text):
        print(text)

    def start(self):
        self.a.dojob()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    m = Main()
    m.start()
    sys.exit(app.exec_())

класс А:

from PyQt5.QtCore import pyqtSignal, QObject
from B import B


class A(QObject):
    msg = pyqtSignal(str)

    def __init__(self):
        super(A, self).__init__()
        self.b = B()

    def send_message(self):
        self.msg.emit("from A")

    def dojob(self):
        self.send_message()
        self.b.dojobB()

класс Б:

from PyQt5.QtCore import pyqtSignal, QObject


class B(QObject):
    msg = pyqtSignal(str)

    def __init__(self):
        super(B, self).__init__()

    def send_message(self):
        self.msg.emit("from B")

    def dojobB(self):
        self.send_message()

person user12209348    schedule 05.12.2019    source источник


Ответы (1)


Проблема в том, что вы думаете, что объект b, созданный в Main, это тот же объект b, который создан в A, но это неверно, это 2 разных объекта (вы можете выполнить print(self.b) в каждом, и вы увидите, что вы получите разные я бы).

Таким образом, есть 2 возможных решения:

  • Не создавать объект b в A и передавать объект b, созданный в Main, в класс A через конструктор:
class Main(QObject):
    def __init__(self):
        super(Main, self).__init__()
        self.b = B()
        self.a = A(self.b)
        self.a.msg.connect(self.show_message)
        self.b.msg.connect(self.show_message)
class A(QObject):
    msg = pyqtSignal(str)

    def __init__(self, b):
        super(A, self).__init__()
        self.b = b
  • Либо не создавать новый объект b в Main и подключить сигнал объекта b созданного в A
class Main(QObject):
    def __init__(self):
        super(Main, self).__init__()
        self.a = A()
        self.a.msg.connect(self.show_message)
        self.a.b.msg.connect(self.show_message)
person eyllanesc    schedule 05.12.2019
comment
Спасибо! Я знал, что это как-то связано с тем, что это разные объекты, но не знал, как это решить. Я буду придерживаться второго решения. Спасибо еще раз. - person user12209348; 05.12.2019