pyqt5开发的核心机制:理解信号和槽
1。简介
Signal和Slot是Qt中的核心机制,也是PyQt中对象之间的处理。通信机制
在pyqt5中,每个QObject对象和所有控件都继承自pyqt中的QWidget,支持信号和槽
当信号发出时,连接槽函数会自动执行。 pyqt5中的信号和槽通过connect()函数连接。
在pyqt5中,信号分为两类:
1。内置信号(详细阅读各个组件)
2.特殊信号(主要用于组件之间的数据传输和窗口交互)
2.内置信号简介
使用connect()方法将信号和槽函数绑定在一起,并使用disconnect()函数解除信号和槽
1的绑定。按钮单击事件(示例)
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函数
...
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))
...
3。特殊信号
1。最基本的无参数信号和槽
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。在信号
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 上发出数据。对于发送多种类型数据的事件
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_())4。使用装饰器信号和槽
1。使用格式
@PyQt5.QtCore.pyqtSlot(参数) def on_发送者对象名称_发射信号名称(self,参数): pass
2。注意,使用装饰器时,必须定义两个东西
QMetaObject.connectSlotsByName(self)
来绑定事件定义是id(self.btn.setObjectName('name'))
3。常规活动按钮
...
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。使用装饰器后的事件
...
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('使用装饰器点击了按钮')
... 版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网
