信号管理器¶
描述¶
类 Signalmanager
在 p/sources/pyside6/libpyside 中负责将 Qt 信号路由到接收器(文件 signalmanager.cpp、qobjectconnect.cpp、pysidesignal.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
保留了一个带有销毁回调的弱引用。
问题¶
与线程和对象删除相关的各种问题,通过变通方法解决 (PYSIDE-2646)
复杂的代码,难以维护
断开连接不适用于带有上下文参数的
QObject.connect()
;它还会泄漏方法
计划¶
更改
QObject: 添加带有上下文参数的connect()重载 acab25a3ccb836818e5089b23d40196bc7414b7a
实现了一个基于 QtPrivate::QSlotObjectBase
和
QObjectPrivate::connect(QObject*,int,QObject*,QtPrivate::QSlotObjectBase*)
(pysideqslotobject.cpp) 的连接。原则上,这可以启用移除
GlobalReceiverV2
,但需要保留 QMetaObject::Connection
用于
断开连接。