4 votes

Comment créer des pyqtSignals dynamiquement ?

Est-il possible de créer des signaux au moment de l'exécution lorsque cela est nécessaire ?

Je fais quelque chose comme ça dans une fonction :

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)

Comme vous pouvez le voir, j'ai un dict qui stocke les paires str, pyqtSignal. Lorsque j'essaie de connecter le signal à l'écouteur, j'obtiens l'erreur suivante :

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

N'est-il pas possible de créer pyqtSignals au moment de l'exécution sans les variables de la classe ?

Santé.

4voto

ekhumoro Points 23190

Non, ce n'est pas possible. Les objet pyqtSignal est une fonction d'usine qui renvoie un descripteur Elle doit donc être créée lors de l'exécution de la déclaration de classe. Pour citer la documentation :

Les nouveaux signaux ne doivent être définis que dans les sous-classes de QObject. T Ils doivent faire partie de la définition de la classe et ne peuvent pas être ajoutés dynamiquement en tant qu'attributs de classe après la définition de la classe .

Nouveaux signaux définis dans ce wa de la classe. Cela signifie qu'ils apparaîtront dans Qt Designer et peuvent être inspectés à l'aide de l'API QMetaObject. [souligné par l'auteur]

Votre code crée non consolidé ce qui explique l'erreur d'attribut. La distinction entre les signaux liés et non liés est exactement la même que pour les méthodes des classes. Pour citer à nouveau la documentation :

Un signal (en particulier un signal non lié) est un attribut de classe. Lorsqu'un est référencé en tant qu'attribut d'une instance de la classe, alors PyQt5 lie automatiquement l'instance au signal afin de créer un signal lié. Il s'agit du même mécanisme que Python utilise pour créer des méthodes liées à partir de fonctions de classe. pour créer des méthodes liées à partir de fonctions de classe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X