您的位置:首页 > 编程语言 > Qt开发

Qt学习笔记:Signal & Slot

2016-06-03 00:18 381 查看
在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)


简单来说就是:

Sender.Signal.connect(Slot)

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

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


总结

这两种方式谈不上孰优孰劣,选择哪种,就看程序猿个人习惯。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: