PyQt5中最核心的内容就是信号与槽。本文主要结合一个简单的实例对这部分内容进行详细的介绍。

预备知识

本文是笔者在学习pyQt5中的学习笔记,需要建立在一定基础之上,如下。

  • Python面向对象知识
  • 了解PyQt5基本操作:布局、常用控件等。
  • Qt Designer的使用

何谓信号与槽

信号和槽机制是PyQt5的核心机制,主要用来在对象之间传递数据。具体的过程是:

1
事件发生->发射signal->slot响应

信号

当对象的状态发生变化的时候,信号就由对象发射(emit)出去,与其关联的槽函数立刻被执行。

对象只负责发送信号,不关心是哪个对象接收信号。这样保证了对象与对象之间的低耦合。

负责接受信号,当和槽连接的信号被发射时,槽会被调用。一个槽并不知道是否有信号与自己相连。

如何连接信号与槽

在Qt Designer中,有很便捷的方法。在Edit中通过Edit Signals/Slots(F4)连接信号与槽。但是这种方式,并不能完全满足我们的需求,很多时候我们需要手动(手写代码)连接信号与槽。

手动连接信号与槽

手动连接主要下面三种方式:

1
2
3
self.connect(widgets,SIGNAL("signal"),func)
self.connect(widgets,SIGNAL("signal"),instance.methodname)
self.connect(widgets,SIGNAL("signal"),instance,SLOT("slotSignature"))

##自定义槽函数
Qt中的对象有很多预定义的信号和槽函数。但是预定义的槽函数毕竟有限,我们需要自定义槽函数,实现我们的需求。当然可以通过eric自动生成槽函数,但是这种方式主要的逻辑仍然需要自己实现,这里就不介绍。

举个栗子:这里用自己写的一个岩体分级的工具为例。逻辑非常简单:就是输入一堆参数,得到一个结果,通过结果对岩体进行分级,界面如下。

UI设计通过Qt Designer生成。

逻辑部分和UI部分分离,新建.py文件,创建一个类,继承QMainWindow和QtDesigner生成的UI类Ui_MainWindow。

1
2
3
4
5
class MainWindow(QMainWindow, Ui_MainWindow):
global QRD, Jn, Jr, Ja, Jw, SRF, res,rl
def __init__(self, parent = None):
QMainWindow.__init__(self,parent)
self.setupUi(self)

继承父类Ui_MainWindow的setupUi方法,setupUi方法中通过控件的名字来自动连接槽:

1
QtCore.QMetaObject.connectSlotsByName(MainWindow)

通过自定义槽函数来实现特定的功能:

1
2
def on_pushButton_clicked(self):
self.test()

其中test()主要实现具体的逻辑功能,注意这里自定义槽函数的名称要和控件名称(pushButton)对应:on_pushButton\ _clicked。

通过实例ui的show()方法来显示程序:

1
2
3
4
5
6
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
ui = MainWindow()
ui.show()
sys.exit(app.exec_())

这里对信号和槽做了粗浅的认识和学习,关于其他内容不再赘述,更多详细内容,可参照官方文档。

官方文档

PyQt5 Reference Guide