是否可以在运行时不使用类变量在实例上创建pyqtSignals? [英] Is it possible to create pyqtSignals on instances at runtime without using class variables?

查看:24
本文介绍了是否可以在运行时不使用类变量在实例上创建pyqtSignals?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否可以在需要时在运行时创建信号?

我在函数中执行类似的操作:

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)
如您所见,我有一个存储字符串、pyqtSignal对字典。当我尝试将信号连接到监听器时,收到错误:

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

如果没有Bean类变量,是否无法在运行时创建pyqtSignals?

干杯。

推荐答案

不,这是不可能的。pyqtSignal object是返回descriptor的工厂函数,因此必须在执行class语句时创建。引用文档中的内容:

新信号只能在QObject的子类中定义。他们 必须是类定义的一部分,不能动态添加 定义类后作为类属性

以这种方式定义的新信号将自动添加到 类的QMetaObject。这意味着它们将出现在Qt设计器中 并且可以使用QMetaObject API进行自省。[已添加强调]

您的代码正在创建未绑定的信号对象,这就是您收到属性错误的原因。绑定和未绑定信号之间的区别与类的方法完全相同。要从文档中重新报价:

信号(特别是未绑定信号)是一个类属性。当一个 信号被引用为类实例的属性,然后 PyQt5自动将实例绑定到信号,以便 创建绑定信号。这与Python本身的机制相同 用于从类函数创建绑定方法。

这篇关于是否可以在运行时不使用类变量在实例上创建pyqtSignals?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆