
公众号:uncle39py
V1
2023/05/05阅读:15主题:默认主题
100.自定义信号
通过信号与槽,可以实现两个对象之间的通信
一.自定义信号的3个步骤:
from PyQt5.QtCore import *
class MySignal(QObject):
#步骤1:
#定义一个类属性的信号对象,object为向外界传递的参数类型,发射的时候具体传递
#参数类型可以写多个,比如pyqtSignal(str,int,int)
sendmsg = pyqtSignal(object)
def run(self):
#步骤3:触发信号,传递参数,触发信号后会去执行绑定的槽函数
#参数的类型和个数要跟定义信号时一致,比如self.sendmsg.emit("hello",3,4)
self.sendmsg.emit("hello")
class MySlot(QObject):
def get(self,msg):
print("信息:"+msg)
if __name__ == '__main__':
signal = MySignal()
slot = MySlot()
#步骤2:信号与槽的绑定
signal.sendmsg.connect(slot.get)
signal.run() #步骤3:触发信号
二.装饰器自动连接信号与槽
信号与槽之间连接的第二种写法(常用与QtDesigner自动生成的代码中)

from PyQt5.Qt import *
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("装饰器自动连接信号与槽")
self.resize(500,500)
self.init_ui()
def init_ui(self):
btn = QPushButton("按钮",self)
btn.setObjectName("btn")
#1.作用是对self内部所有的子孙控件,按照objectName自动连接到对应的槽函数:on_objectName_信号
#2.必须放在最后面,这个时候self内部才会有已经创建了的子孙控件
QMetaObject.connectSlotsByName(self)
@pyqtSlot(bool)
def on_btn_clicked(self,val):
print("按钮被点击")
#bool为信号向外界传递的参数
if __name__ == '__main__':
import sys
app = QApplication(sys.argv)
win = Window()
win.show()
sys.exit(app.exec_())
作者介绍

公众号:uncle39py
V1