PyQt的信号槽机制又是它的一大特色,刚接触到这个东西,感觉真的很神奇

信号和槽这个概念本身有点像是物理学的概念,但其实对我来说并不觉得陌生

以前玩MineCraft,也就是我的世界的时候,里面有个红石系统,其实就是玩的这个

一个开关,用红石导线连接到活塞

开关打开,就产生了红石信号,并通过红石作为导线发射到活塞,活塞收到信号之后就被推了出去

里面的红石信号就相当于这里的信号,活塞就相当于这里的槽,槽收到信号之后会触发一系列的事情

又比如说田径场上正在比赛的运动员,一听到枪声,就随声起跑

枪声就是信号,运动员的大脑就是槽,大脑接收到信号之后就开始条件反射的起跑

PyQt通过在方法间建立信号槽机制,可以轻松的管理用户的操作,比如点击按钮,使用快捷键等

下面一张图简单明了地解释了信号和槽的关系




可以看到,一个信号可以连接多个槽,其实一个槽也可以接受多种信号

下面看看PyQt中信号槽机制的使用方法

1、直接连接方法槽,将btn_usermgmt按钮的点击事件连接到switch_to_usermgmt方法:

self.btn_usermgmt.clicked.connect(self.switch_to_usermgmt)

这样就可以实现当点击btn_usermgmt按钮时,调用switch_to_usermgmt方法

2、使用带参数的信号

先定义一个带参数的方法作为槽

def updateProgressBar(self, val):
        self.progressBar.setValue(val)          #更新进度条

再自定义一个信号

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信号

接着绑定信号和槽即可

self.connect(self.threadclass, QtCore.SIGNAL("CPU_VALUE"), self.updateProgressBar)          #把自己的成员方法作为槽连接到threadclass线程的信号

整个程序完整的代码:

https://github.com/istobran/cpuUsageViewer

3、断开连接

把之前建立的连接给断开,用法跟前面的connect基本一样

self.btn_add.clicked.disconnect(self.ready_add_user)


参考文档:

怎样使用信号与槽?

Qt入门之信号与槽机制

PyQt4 信号和槽详解