Qt学习笔记:Signal & Slot

在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自定义分两步:声明,确定发射点。

例子:

扫描二维码关注公众号,回复: 9952702 查看本文章
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)

简单来说就是:

**Sender.Signal.connect(Slot)**

需要注意的是如果signal有重载,那么使用的时候需要标明重载的类型:

		"""
		假如要使用第二个
		clicked = pyqtSignal()
		clicked = pyqtSignal(QString)
		"""
        self.button1.clicked[QString].connect(self.close)

总结

这两种方式谈不上孰优孰劣,选择哪种,就看程序猿个人习惯。

发布了45 篇原创文章 · 获赞 46 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/founderznd/article/details/51571318