分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
信号(Signal)和槽(Slot)是Qt中的核心机制,也是在PyQt编程中对象之间进行通信的机制。本文介绍了几种PyQt 5信号与槽的几级玩法。
在Qt中,每一个QObject对象和PyQt中所有继承自QWidget的控件(这些都是QObject的子对象)都支持信号与槽机制。当信号发射时,连接的槽函数将会自动执行。在PyQt 5中信号与槽通过object.signal.connect()方法连接。
PyQt的窗口控件类中有很多内置信号,开发者也可以添加自定义信号。信号与槽具有如下特点。
- 一个信号可以连接多个槽。
- 一个信号可以连接另一个信号。
- 信号参数可以是任何Python类型。
- 一个槽可以监听多个信号。
- 信号与槽的连接方式可以是同步连接,也可以是异步连接。
- 信号与槽的连接可能会跨线程。
- 信号可能会断开。
在GUI编程中,当改变一个控件的状态时(如单击了按钮),通常需要通知另一个控件,也就是实现了对象之间的通信。在早期的GUI编程中使用的是回调机制,在Qt中则使用一种新机制——信号与槽。在编写一个类时,要先定义该类的信号与槽,在类中信号与槽进行连接,实现对象之间的数据传输。信号与槽机制示意图如图1所示。
图1
当事件或者状态发生改变时,就会发出信号。同时,信号会触发所有与这个事件(信号)相关的函数(槽)。信号与槽可以是多对多的关系。一个信号可以连接多个槽,一个槽也可以监听多个信号。
关于PyQt API中信号与槽的更详细解释,可以参考官方网站: http://pyqt.sourceforge.net/Docs/PyQt5/signals_slots.html?highlight=pyqtsignal#PyQt5.QtCore.pyqtSignal。
1 高级自定义信号与槽
所谓高级自定义信号与槽,指的是我们可以以自己喜欢的方式定义信号与槽函数,并传递参数。自定义信号的一般流程如下:
(1)定义信号。
(2)定义槽函数。
(3)连接信号与槽函数。
(4)发射信号。
1.定义信号
通过类成员变量定义信号对象。
class MyWidget(QWidget): # 无参数的信号 Signal_NoParameters = pyqtSignal() # 带一个参数(整数)的信号 Signal_OneParameter = pyqtSignal(int) # 带一个参数(整数或者字符串)的重载版本的信号 Signal_OneParameter_Overload = pyqtSignal([int],[str]) # 带两个参数(整数,字符串)的信号 Signal_TwoParameters = pyqtSignal(int,str) # 带两个参数([整数,整数]或者[整数,字符串])的重载版本的信号 Signal_TwoParameters_Overload = pyqtSignal([int,int],[int,str])
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
2.定义槽函数
定义一个槽函数,它有多个不同的输入参数。
class MyWidget(QWidget): def setValue_NoParameters(self): '''无参数的槽函数''' pass def setValue_OneParameter(self,nIndex): '''带一个参数(整数)的槽函数''' passdef setValue_OneParameter_String(self,szIndex): '''带一个参数(字符串)的槽函数''' pass def setValue_TwoParameters(self,x,y): '''带两个参数(整数,整数)的槽函数''' pass def setValue_TwoParameters_String(self,x,szY): '''带两个参数(整数,字符串)槽函数''' pass
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
3.连接信号与槽函数
通过connect方法连接信号与槽函数或者可调用对象。
app = QApplication(sys.argv) widget = MyWidget() # 连接无参数的信号widget.Signal_NoParameters.connect(self.setValue_NoParameters ) # 连接带一个整数参数的信号widget.Signal_OneParameter.connect(self.setValue_OneParameter) # 连接带一个整数参数,经过重载的信号widget.Signal_OneParameter_Overload[int]. connect(self.setValue_OneParameter) # 连接带一个整数参数,经过重载的信号widget.Signal_OneParameter_Overload[str]. connect(self.setValue_OneParameter_String ) # 连接一个信号,它有两个整数参数widget.Signal_TwoParameters.connect(self.setValue_TwoParameters ) # 连接带两个参数(整数,整数)的重载版本的信号widget.Signal_TwoParameters_Overload[int,int]. connect(self.setValue_TwoParameters ) # 连接带两个参数(整数,字符串)的重载版本的信号widget.Signal_TwoParameters_Overload[int,str]. connect(self.setValue_TwoParameters_String ) widget.show()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8