Qt学习笔记:Signal & Slot
2016-06-03 00:18
381 查看
在Qt当中,我们采用另一种反馈技术,信号(Signal)和槽(Slot)。
他们之间的关系如下:
当特定的事件发生时,就会产生信号,并触发与之相连的槽函数,Qt自带大量的 Signal 和 Slot,使用也非常简单:
第一个参数是你的信号发出点
第二个参数就是Signal
第三个参数就是Slot
这里唯一需要注意的就是,Slot虽然是一个函数,但是作为参数传入的时候后面是不带括号的
clicked()和close()都是Qt当中非常常用的Signal和Slot,就不再多说,事实上,Signal和Slot都是可以自定义的,下面重点讲讲自定义的过程。
Signal自定义分两步:声明,确定发射点。
例子:
至此,一些基本的 Signal 就定义好了。
类似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 时,括号里面一定要带上参数类型。
PyQt新的形式:
官方的方法,非常简洁优雅,值得学习。
以上面第一行的代码为例
对比
简单来说就是:
Sender.Signal.connect(Slot)
需要注意的是如果signal有重载,那么使用的时候需要标明重载的类型:
他们之间的关系如下:
当特定的事件发生时,就会产生信号,并触发与之相连的槽函数,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)
总结
这两种方式谈不上孰优孰劣,选择哪种,就看程序猿个人习惯。相关文章推荐
- Qt Write and Read XML File 读写XML文件
- Qt官方开发环境生成的exe发布方式--使用windeployqt
- Qt实现停靠功能
- Qt的QWaitCondition(允许线程在一定条件下唤醒其他线程,这样对不间断上传可能比较适用)
- VS2015+OpenCV2.4.9+Qt5.6安装配置
- Qt对话框_模态/非模态
- QT窗口置顶/真透明/背景模糊/非矩形/跳过任务栏分页器/无边框/无焦点点击/焦点穿透
- Qt中文件操作遇到的(变量,容器,结构体)
- Qt中所有类型之间的转换
- QTP(UFT)只能录制窗口的操作,不能录制窗口中对象的操作
- Qt自定义委托在QTableView中绘制控件、图片、文字
- Qt Createor和VS2012里面添加信号和槽
- Qt 信号和槽
- Qt 常用容器
- Qt5的新特性
- Qt Delgate 委托的使用
- qt和VS动态库调用心得
- QTableWidget的使用说明和增删改
- Qt TreeWidget的增删改
- Qt 线程