1、概述
信号的绑定是由在类的实例变量中第一次通过类实例的方式(即"self.信号"或“实例名.信号”)引用时触发,PyQt5会自动将该实例绑定到该信号,以便创建绑定信号。
绑定信号具有实现相关功能的connect()、disconnect()和emit()方法。
2、绑定的触发
从信号绑定过程可以看出信号的引用与通用的类变量有所区别,在实例方法中只能通过"self.信号"或或“实例名.信号”方式引用,不能通过类名引用,否则无法触发信号与实例的绑定,就无法调用connect()等相关信号的方法。
老猿发现这种绑定不只是应用的代码通过"self.信号"或“实例名.信号”能触发,在Debug模式下实例的构造方法完成超类构造方法调用后,通过Debug观察"self.信号"方式也能触发,这是因为Python是解释型语言导致的。
3、绑定信号的本质理解
在Debug模式下绑定后的信号观察时结构示例如下:
可以看到实例化后的信号其实与类变量已经不是一个变量,已经变成了一个类似实例变量的存在,每个实例有自己单独的绑定信号,不像Python的类变量,是在类的所有实例中共享的。因此PyQt的信号绑定老猿认为可以理解为:信号这一个特殊的类变量,在定义信号的类实例化一个对象实例后,当这个实例首次通过“self.信号”或“实例名.信号”引用时,自动构造一个与信号相关的实例变量,并与代码中定义的原有信号类变量同名并关联,这就是绑定信号。
4、小结
总体来说,实际上信号的绑定就是在信号对应类的实例内完成创建一个实例信号变量,这个变量与类内定义的信号已经不是同一个对象,而是通过“实例.信号”方式触发创建的一个新变量。因此同一个类的不同实例的“self.信号”是不同的,它们各自发出的信号是各自的,互不干扰,当一个类的信号绑定的槽是类的实例方法时,这个类不同的实例发送信号时响应的是该实例自己的实例方法,其他实例的槽方法不会响应。