一、介绍
信号(Signal)和槽(Slot)是Qt中的核心机制,也是PyQt变成中对象之间进行通信的机制
在pyqt5中,每一个QObject对象和pyqt中所有继承自QWidget的控件都支持信号和槽
当信号发射时,连接槽函数将会自动执行,pyqt5中信号与槽通过connect()函数连接起来的。
在pyqt5中信号主要分两类:
1.内置信号(详细参考各个组件)
2.自定义信号(主要用于组件之间数据的传递与窗口交互)
二、内置信号的简单介绍
使用connect()方法将信号与槽函数绑定在一起,使用disconnect()函数将信号与槽解除绑定
1、按钮点击事件(举例)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
import sys
from PyQt5.Qt import *
class Window(QWidget):
def __init__( self , * args, * * kwargs):
super ().__init__( * args, * * kwargs)
self .setWindowTitle( '按钮事件' )
self .resize( 500 , 500 )
self .move( 400 , 200 )
self .btn = QPushButton( '按钮' , self )
self .init_ui()
def init_ui( self ):
self .btn.resize( 100 , 30 )
self .btn.move( 100 , 50 )
self .btn.clicked.connect( self .btn_hand)
def btn_hand( self ):
print ( '按钮点击了' )
if __name__ = = "__main__" :
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
|
2、如果连接的事件要传递参数直接使用lambda函数
1
2
3
4
5
6
7
8
9
10
|
...
def init_ui( self ):
self .btn.resize( 100 , 30 )
self .btn.move( 100 , 50 )
self .btn.clicked.connect( lambda : self .btn_hand( 1 ))
def btn_hand( self , flag):
print ( '按钮点击了:{}' . format (flag))
...
|
三、自定义信号
1、最基本无参数的信号与槽
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
import sys
from PyQt5.Qt import *
class SignalObj(QObject):
"""
定义一个信号的类
"""
# 自定义一个信号
sendMsg = pyqtSignal()
def __init__( self ):
super ().__init__()
def run( self ):
self .sendMsg.emit()
class Window(QWidget):
def __init__( self , * args, * * kwargs):
super ().__init__( * args, * * kwargs)
self .setWindowTitle( '自定义事件' )
self .resize( 500 , 500 )
self .move( 400 , 200 )
self .btn = QPushButton( '按钮' , self )
self .send = SignalObj()
# 将事件与槽建立关联
self .send.sendMsg.connect( self .slot_hand)
self .init_ui()
def init_ui( self ):
# 系统中自带的事件与槽函数建立连接
self .btn.clicked.connect( self .btn_hand)
def btn_hand( self ):
self .send.run()
@staticmethod
def slot_hand():
print ( '我是自定义的槽函数' )
if __name__ = = "__main__" :
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
|
2、信号中发射出数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
import sys
from PyQt5.Qt import *
class SignalObj(QObject):
"""
定义一个信号的类
"""
# 自定义一个信号,注意这个地方定义约束发送出去的参数类型,下面要一致
sendMsg = pyqtSignal( str )
def __init__( self ):
super ().__init__()
def run( self ):
self .sendMsg.emit( 'hello' )
class Window(QWidget):
def __init__( self , * args, * * kwargs):
super ().__init__( * args, * * kwargs)
self .setWindowTitle( '自定义事件' )
self .resize( 500 , 500 )
self .move( 400 , 200 )
self .btn = QPushButton( '按钮' , self )
self .send = SignalObj()
# 将事件与槽建立关联
self .send.sendMsg.connect( self .slot_hand)
self .init_ui()
def init_ui( self ):
# 系统中自带的事件与槽函数建立连接
self .btn.clicked.connect( self .btn_hand)
def btn_hand( self ):
self .send.run()
@staticmethod
def slot_hand(msg):
print (f '我是自定义的槽函数:{msg}' )
if __name__ = = "__main__" :
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
|
3、对于发送多种不同数据类型的事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
import sys
from PyQt5.Qt import *
class SignalObj(QObject):
"""
定义一个信号的类
"""
# 自定义一个信号,注意这个地方定义约束发送出去的参数类型,下面要一致
sendMsg = pyqtSignal([ str ], [ int ])
def __init__( self ):
super ().__init__()
def run( self ):
self .sendMsg[ str ].emit( 'hello' )
self .sendMsg[ int ].emit( 999 )
class Window(QWidget):
def __init__( self , * args, * * kwargs):
super ().__init__( * args, * * kwargs)
self .setWindowTitle( '自定义事件' )
self .resize( 500 , 500 )
self .move( 400 , 200 )
self .btn = QPushButton( '按钮' , self )
self .send = SignalObj()
# 将事件与槽建立关联(这个地方你要接收那个数据类型的事件)
self .send.sendMsg[ int ].connect( self .slot_hand)
self .init_ui()
def init_ui( self ):
# 系统中自带的事件与槽函数建立连接
self .btn.clicked.connect( self .btn_hand)
def btn_hand( self ):
self .send.run()
@staticmethod
def slot_hand(msg):
print (f '我是自定义的槽函数:{msg}' )
if __name__ = = "__main__" :
app = QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
|
四、使用装饰器信号与槽
1、使用格式
1
2
3
|
@PyQt5 .QtCore.pyqtSlot(参数)
def on_发送者对象名称_发射信号名称( self ,参数):
pass
|
2、注意点,使用装饰器必须定义两个东西
1
|
QMetaObject.connectSlotsByName( self )
|
给需要绑定事件的定义一个id(self.btn.setObjectName('名称'))
3、按钮的普通事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
...
class Window(QWidget):
def __init__( self , * args, * * kwargs):
super ().__init__( * args, * * kwargs)
self .setWindowTitle( '装饰器信号与槽' )
self .resize( 500 , 500 )
self .move( 400 , 200 )
self .btn = QPushButton( '按钮' , self )
self .init_ui()
def init_ui( self ):
self .btn.clicked.connect( self .btn_hand)
@staticmethod
def btn_hand():
print ( '使用connect点击了按钮' )
...
|
4、使用装饰器后的事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
...
class Window(QWidget):
def __init__( self , * args, * * kwargs):
super ().__init__( * args, * * kwargs)
self .setWindowTitle( '装饰器信号与槽' )
self .resize( 500 , 500 )
self .move( 400 , 200 )
self .btn = QPushButton( '按钮' , self )
self .init_ui()
# 要在加载组件后使用
QMetaObject.connectSlotsByName( self )
def init_ui( self ):
# 这个地方定义的名字直接在下面使用
self .btn.setObjectName( 'btn' )
@pyqtSlot ()
def on_btn_clicked( self ):
print ( '使用装饰器点击了按钮' )
...
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://juejin.im/post/5c66069a6fb9a049d44254c2