Я создаю (одиночный) класс обслуживания, включающий сигнал "something_changed". Эта услуга включена в базовый родительский класс и в нем связана со слотом. Из этого родительского класса производными являются два дочерних класса 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()
Классы.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()
, вызывается функция child1 "_something_changed", поэтому соединение должно быть установлено.
Спасибо
__new__
может быть проблематичным с классами PyQt. Если вы избавитесь от него и будете использовать фабричную функцию, которая вместо этого возвращает глобальный модуль, ваш пример будет работать. - person ekhumoro   schedule 17.11.2018__new__
на статический метод get_instance, основанный на этот смысл, и это сработало! - person stdonn   schedule 18.11.2018