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

标签 python-3.x pyqt runtime pyqt5 signals-slots

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

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

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/

相关文章:

python - PyCharm/PyQt : How to obtain code completion with dynamically loaded ui files

qt4 - QT 小部件信号 - 综合列表?

Python 嵌套 for 循环比单个 for 循环更快

ios - ObjC 未正确转发 scrollViewDidScroll 消息

python - 在 python 中实现高效的固定大小 FIFO

python - 更改值时Opencv重绘图像

python - 生成器和函数

python - 如何将 requests.cookiejar 转换为 qnetworkcookiejar?

python - Python 3 中的 super() 怪异之处

C运行时库: what for?