подключить сигнал PyQT5 из класса обслуживания к нескольким слотам - PullRequest
0 голосов
/ 17 ноября 2018

Я создаю (одноэлементный) класс обслуживания, включающий в себя что-то "сигнал".Эта услуга включена в базовый родительский класс и подключена к слоту.Из этого родительского класса получаются два дочерних класса Child1 и Child2, оба инициализируются в основном методе.

Когда я отправляю сигнал, выполняется только слот последнего подключенного дочернего элемента, кажется, что только одинвозможно подключение (в отличие от документов и других источников, например здесь ).

Чтобы продемонстрировать свою проблему, я упростил классы:

Service.py

from PyQt5.QtCore import QObject, pyqtSignal

class Service(QObject):
    __instance = None

    something_changed = pyqtSignal()

    def __new__(cls) -> "Service":
        if cls.__instance is None:
            print("Creating new service instance")
            cls.__instance = QObject.__new__(cls)
        else:
            print("Returning existing service instance")

        return cls.__instance

    def do_something(self):
        print("Do something")
        self.something_changed.emit()

Classes.py

from PyQt5.QtCore import QObject
from Service import Service

class Parent(QObject):
    def __init__(self):
        super().__init__()
        self._service = Service()
        self._service.something_changed.connect(self._something_changed)
        print("Init Parent: " + self.__class__.__name__)

    def _something_changed(self):
        print("Parent - _something_changed: " + self.__class__.__name__)


class Child1(Parent):
    def __init__(self):
        super().__init__()
        print("Init Child1: " + self.__class__.__name__)

    def _something_changed(self):
        print("Child1 - _something_changed: " + self.__class__.__name__)


class Child2(Parent):
    def __init__(self):
        super().__init__()
        print("Init Child2: " + self.__class__.__name__)

    def _something_changed(self):
        print("Child2 - _something_changed: " + self.__class__.__name__)

main.py

from Classes import Child1, Child2
from Service import Service

if __name__ == "__main__":
    service = Service()

    child1 = Child1()
    child2 = Child2()

    service.do_something()

И полученный результат:

Creating new service instance
Returning existing service instance
Init Parent: Child1
Init Child1: Child1
Returning existing service instance
Init Parent: Child2
Init Child2: Child2
Do something
Child2 - _something_changed: Child2

То, что я ожидал и чего я также пытался достичь, - это запустить функцию "_something_changed" от обоих потомков, когда излучался сигнал.

Дополнительный узел:

Когда я комментирую инициализацию child2 = Child2(), вызывается функция "_something_changed" child1, поэтому соединение должно быть установлено.

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...