Как динамически создавать pyqtSignals - PullRequest
0 голосов
/ 11 мая 2018

Есть ли возможность создавать сигналы во время выполнения при необходимости?

Я делаю что-то вроде этого в функции:

class WSBaseConnector(QObject)

    def __init__(self) -> None:
        super(QObject, self).__init__()    
        self._orderBookListeners: Dict[str, pyqtSignal[OrderBookData]] = {}

    def registerOrderBookListener(self, market: str, listener: Callable[[OrderBookData], None], loop: AbstractEventLoop) -> None:
            try:
                signal = self._orderBookListeners[market]
            except KeyError:
                signal = pyqtSignal(OrderBookData)
                signal.connect(listener)
                self._orderBookListeners[market] = signal
            else:
                signal.connect(listener)

Как видите, у меня есть диктаткоторый хранит пары str, pyqtSignal.Когда я пытаюсь подключить сигнал к слушателю, я получаю сообщение об ошибке:

'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'

Разве невозможно создать pyqtSignals во время выполнения без использования переменных класса?

Приветствия.

1 Ответ

0 голосов
/ 11 мая 2018

Нет, это невозможно. Объект pyqtSignal является фабричной функцией, которая возвращает дескриптор , поэтому он должен быть создан при выполнении оператора класса. Цитировать из документов:

Новые сигналы должны быть определены только в подклассах QObject. Они должен быть частью определения класса и не может быть добавлен динамически как атрибуты класса после того, как класс был определен .

Новые сигналы, определенные таким образом, будут автоматически добавлены к Класс QMetaObject. Это означает, что они появятся в Qt Designer и может быть проанализирован с помощью API QMetaObject. [выделение добавлено]

Ваш код создает несвязанные объекты сигналов, поэтому вы получаете ошибку атрибута. Различие между связанными и несвязанными сигналами точно такое же, как и в методах классов. Чтобы процитировать еще раз из документов:

Сигнал (в частности, несвязанный сигнал) является атрибутом класса. Когда сигнал упоминается как атрибут экземпляра класса, то PyQt5 автоматически связывает экземпляр с сигналом, чтобы создать связанный сигнал. Это тот же механизм, что и сам Python используется для создания связанных методов из функций класса.

...