在Qt当中,我们采用另一种反馈技术,信号(Signal)和槽(Slot)。
他们之间的关系如下:
当特定的事件发生时,就会产生信号,并触发与之相连的槽函数,Qt自带大量的 Signal 和 Slot,使用也非常简单:
self.connect(self.button1, SIGNAL("clicked()"), self.close)
第一个参数是你的信号发出点
第二个参数就是Signal
第三个参数就是Slot
这里唯一需要注意的就是,Slot虽然是一个函数,但是作为参数传入的时候后面是不带括号的
clicked()和close()都是Qt当中非常常用的Signal和Slot,就不再多说,事实上,Signal和Slot都是可以自定义的,下面重点讲讲自定义的过程。
Slot
Slot非常简单,如果它对应的是不带参数的Signal,那么它就是普通的自定义方法或者函数,如果涉及到带参数的Signal,可能稍微麻烦一点,等会和Signal一起讲。
Signal
在PyQt 4.5版本以后可以采用新的信号与槽方式。
Signal自定义分两步:声明,确定发射点。
例子:
from PyQt4.QtCore import *
from PyQt4.QtGui import *
def MyWidget(QWidget):
testSignal_1 = pyqtSignal() # 定义一个Signal,无参数
testSignal_2 = pyqtSignal(int) # 带一个参数
testSignal_3 = pyqtSignal([int],[QString]) # 带一个参数的重载版本
testSignal_4 = pyqtSignal(int,int) # 两个参数
testSignal_5 = pyqtSignal([int,int],[int,QString]) # 两个参数重载
...
def mousePressEvent(self,e):
self.testSignal_1.emit() # 确定信号发射点,这里是鼠标点击时,发射信号
...
self.testSignal_4[int,int].emit(e.x(),e.y()) # 多参数信号发射
...
至此,一些基本的 Signal 就定义好了。
Connect
connect的方式有好几种:
类似C++的方式:
官方给出的C++例子如下:
connect(sender, SIGNAL(destroyed(QObject*)), this,SLOT(objectDestroyed(Qbject*)));
connect(sender, SIGNAL(destroyed(QObject*)), this, SLOT(objectDestroyed()));
connect(sender, SIGNAL(destroyed()), this, SLOT(objectDestroyed()));
在python中也可以使用类似的形式,需要注意,在使用带参数的 Signal 时,括号里面一定要带上参数类型。
self.connect(self.button1, SIGNAL("clicked()"), self.close)
self.connect(self.button1, SIGNAL("testSignal_2(int)"), self.close)
PyQt新的形式:
官方的方法,非常简洁优雅,值得学习。
以上面第一行的代码为例
self.connect(self.button1, SIGNAL("clicked()"), self.close)
对比
self.button1.clicked.connect(self.close)
简单来说就是:
需要注意的是如果signal有重载,那么使用的时候需要标明重载的类型:
"""
假如要使用第二个
clicked = pyqtSignal()
clicked = pyqtSignal(QString)
"""
self.button1.clicked[QString].connect(self.close)
总结
这两种方式谈不上孰优孰劣,选择哪种,就看程序猿个人习惯。