PyQt5中最核心的内容就是信号与槽。本文主要结合一个简单的实例对这部分内容进行详细的介绍。
预备知识
本文是笔者在学习pyQt5中的学习笔记,需要建立在一定基础之上,如下。
- Python面向对象知识
- 了解PyQt5基本操作:布局、常用控件等。
- Qt Designer的使用
何谓信号与槽
信号和槽机制是PyQt5的核心机制,主要用来在对象之间传递数据。具体的过程是:1
事件发生->发射signal->slot响应
信号
当对象的状态发生变化的时候,信号就由对象发射(emit)出去,与其关联的槽函数立刻被执行。
对象只负责发送信号,不关心是哪个对象接收信号。这样保证了对象与对象之间的低耦合。
槽
负责接受信号,当和槽连接的信号被发射时,槽会被调用。一个槽并不知道是否有信号与自己相连。
如何连接信号与槽
在Qt Designer中,有很便捷的方法。在Edit中通过Edit Signals/Slots(F4)连接信号与槽。但是这种方式,并不能完全满足我们的需求,很多时候我们需要手动(手写代码)连接信号与槽。
手动连接信号与槽
手动连接主要下面三种方式:1
2
3self.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
5class 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
2def on_pushButton_clicked(self):
self.test()
其中test()主要实现具体的逻辑功能,注意这里自定义槽函数的名称要和控件名称(pushButton)对应:on_pushButton\ _clicked。
通过实例ui的show()方法来显示程序:1
2
3
4
5
6if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
ui = MainWindow()
ui.show()
sys.exit(app.exec_())
这里对信号和槽做了粗浅的认识和学习,关于其他内容不再赘述,更多详细内容,可参照官方文档。