PyQt 的信号槽机制又是它的一大特色,刚接触到这个东西,感觉真的很神奇
信号和槽这个概念本身有点像是物理学的概念,但其实对我来说并不觉得陌生
以前玩 MineCraft,也就是我的世界的时候,里面有个红石系统,其实就是玩的这个
一个开关,用红石导线连接到活塞
开关打开,就产生了红石信号,并通过红石作为导线发射到活塞,活塞收到信号之后就被推了出去
里面的红石信号就相当于这里的信号,活塞就相当于这里的槽,槽收到信号之后会触发一系列的事情
又比如说田径场上正在比赛的运动员,一听到枪声,就随声起跑
枪声就是信号,运动员的大脑就是槽,大脑接收到信号之后就开始条件反射的起跑
PyQt 通过在方法间建立信号槽机制,可以轻松的管理用户的操作,比如点击按钮,使用快捷键等
下面一张图简单明了地解释了信号和槽的关系
可以看到,一个信号可以连接多个槽,其实一个槽也可以接受多种信号
下面看看 PyQt 中信号槽机制的使用方法
1、直接连接方法槽,将 btn_usermgmt 按钮的点击事件连接到 switch_to_usermgmt 方法:1
self.btn_usermgmt.clicked.connect(self.switch_to_usermgmt)
这样就可以实现当点击 btn_usermgmt 按钮时,调用 switch_to_usermgmt 方法
2、使用带参数的信号
先定义一个带参数的方法作为槽1
2def updateProgressBar(self, val):
self.progressBar.setValue(val) # 更新进度条
再自定义一个信号1
2
3
4
5
6
7
8
9class ThreadClass(QtCore.QThread):
def __init__(self, parent = None):
super(ThreadClass, self).__init__(parent)
def run(self):
while True:
val = sysInfo.getCPU()
#print val
self.emit(QtCore.SIGNAL("CPU_VALUE"), val) # 把 val 作为附带参数,发射 CPU_VALUE 信号
接着绑定信号和槽即可1
self.connect(self.threadclass, QtCore.SIGNAL("CPU_VALUE"), self.updateProgressBar) # 把自己的成员方法作为槽连接到 threadclass 线程的信号
整个程序完整的代码:
https://github.com/istobran/cpuUsageViewer
3、断开连接
把之前建立的连接给断开,用法跟前面的 connect 基本一样1
self.btn_add.clicked.disconnect(self.ready_add_user)
参考文档: