PyQt4——处理用户界面事件,信号槽机制

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
2
def updateProgressBar(self, val):
self.progressBar.setValue(val) # 更新进度条

再自定义一个信号

1
2
3
4
5
6
7
8
9
class 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)

参考文档:

怎样使用信号与槽?

Qt 入门之信号与槽机制

PyQt4 信号和槽详解