gpt4 book ai didi

python-3.x - 是否可以在不使用类变量的情况下在运行时在实例上创建 pyqtSignals?

转载 作者:行者123 更新时间:2023-12-01 00:19:04 25 4
gpt4 key购买 nike

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

我在一个函数中做这样的事情:

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 吗?

干杯。

最佳答案

不,这是不可能的。 pyqtSignal object是一个返回 descriptor 的工厂函数,所以必须在执行class语句时创建。引用文档:

New signals should only be defined in sub-classes of QObject. They must be part of the class definition and cannot be dynamically added as class attributes after the class has been defined.

New signals defined in this way will be automatically added to the class’s QMetaObject. This means that they will appear in Qt Designer and can be introspected using the QMetaObject API. [emphasis added]



您的代码正在创建未绑定(bind)的信号对象,这就是您收到属性错误的原因。绑定(bind)和未绑定(bind)信号之间的区别与类的方法完全相同。再次引用文档:

A signal (specifically an unbound signal) is a class attribute. When a signal is referenced as an attribute of an instance of the class then PyQt5 automatically binds the instance to the signal in order to create a bound signal. This is the same mechanism that Python itself uses to create bound methods from class functions.

关于python-3.x - 是否可以在不使用类变量的情况下在运行时在实例上创建 pyqtSignals?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50294652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com