信号管理器

描述

Signalmanagerp/sources/pyside6/libpyside 中负责将 Qt 信号路由到接收器(文件 signalmanager.cppqobjectconnect.cpppysidesignal.cpp)。

有几种接收器:

  • C++ 类的插槽

  • 在Python中使用@Slot声明的QObject派生类的插槽

  • 在Python中声明的QObject派生类的函数。它们将在运行时使用私有的Qt类QMetaObjectBuilder转换为适当的槽。这会导致发出警告,当激活日志类别qt.pyside.libpyside时可见。

  • QObject派生类的方法

  • 其他可调用对象(自由函数、lambda、部分绑定函数)

适当的Qt连接,其中QObject.disconnect()QObject.sender()QObject.connectNotify()工作,对于不是QObject的接收者也是可取的。这是通过使用一个QObject派生的类GlobalReceiverV2来实现的,该类具有由QMetaObjectBuilder创建的动态槽,用于将连接的信号路由到Python接收者(基于内部类DynamicSlotDataV2)。

GlobalReceiverV2 的实例存储在接收器的哈希中 Python 对象在 Signalmanager 中。

QMetaObject::connect(QObject*,int,QObject*,int) 用于基于元方法索引建立连接。

通常情况下,应该保留对接收器可调用对象的引用。然而,在非QObject派生类的方法的情况下,当实例被删除时,连接应该自动断开。在这种情况下传递的可调用对象(signal.connect(foo.slot))是一个部分绑定的函数,它具有self参数。它被分解为self参数和方法。保留对方法的引用。为self保留了一个带有销毁回调的弱引用。

问题

计划

更改 QObject: 添加带有上下文参数的connect()重载 acab25a3ccb836818e5089b23d40196bc7414b7a 实现了一个基于 QtPrivate::QSlotObjectBaseQObjectPrivate::connect(QObject*,int,QObject*,QtPrivate::QSlotObjectBase*) (pysideqslotobject.cpp) 的连接。原则上,这可以启用移除 GlobalReceiverV2,但需要保留 QMetaObject::Connection 用于 断开连接。