——学习《PyQt5快速开发与实战》的笔记
0.信号与槽机制的特点:
1.1 signal、slot都继承自 QtCore
1.2 signal与slot 可以 1对1,1对n,n对1,n对n
1.3 signal可以带参数,参数可以是python任意类型,str,num(intfloat),bool,date,list,dict,tuple)
1.4 QObject.signal.connect(slot),连接
1.5 signal和slot可以是同步,也可以是异步(不懂)
1.6 可以跨线程
1.7 有可能会断开
核心使用语句:
控件:信号需要跟控件绑定
signal:有内置和自定义两种方式
操作方法:connect、disconnect、emit
slot:有内置和自定义两种方式
1.控件绑定信号
from PyQt5.QtCore import pyqtSignal from PyQt5.QtWidgets import QMainWindow class window(QMainWindow): # 直接在控件里面写一个信号变量,是类的全局变量 btnClicked = pyqtSignal() #无参数信号
2、操作信号的方法
QObject.signal.connect(slot[, type=PyQt5.QtCore.QtAutoConnection[,no_reviver_check=False]]) # slot - 要连接的那个槽函数,或者是另外一个信号 # type - 连接的类型,这个一时半会还用不到, # no_revicer_check - 不让底层的C++接收器实例保持存在并且传递信号,默认状态是False,那就是要保持存在并且传递信号 QObject.signal.disconnect(slot) # slot - 要断开连接的槽函数 QObject.signal.emit(*args) # *args 可变参数,什么类型可以接受
3、入门案例
三种方式:
3.1 内置信号与槽
3.2 自定义信号与槽
3.3 装饰器信号与槽(1的衍生,先不管)
3.1 内置信号与槽
# 3.1 内置信号和槽的使用 from PyQt5.QtWidgets import QPushButton, QApplication,QWidget from PyQt5.QtWidgets import QMessageBox import sys app =QApplication([]) widget = QWidget() def showmsg(): QMessageBox.information(widget,'信号提示框','OK,弹出测试信息') if __name__ == '__main__': btn = QPushButton('测试点击按钮',widget) btn.clicked.connect(showmsg) # clicked 内置信号方法 showmsg 槽函数名称,作为索引 widget.show() sys.exit(app.exec_())
3.2 自定义信号与槽的使用
# 3.2 自定义信号与槽的使用 from PyQt5.QtCore import QObject, pyqtSignal # 自定义的信号对象 class Q_type_signal( QObject): #定义信号 sendmsg = pyqtSignal(object) def __init__(self): super(Q_type_signal, self).__init__() def run(self,send_msg): #发射信号 self.sendmsg.emit(send_msg) #send_msg 就是下面槽函数 get() 接受的 msg变量 class Q_type_slot( QObject): def __init__(self): super(Q_type_slot, self).__init__() def get(self,msg): print('QSlot get msg:'+ msg) if __name__ == '__main__': send = Q_type_signal() slot = Q_type_slot() send.sendmsg.connect(slot.get) send.run('hahaha')
动作分解:
执行结果:
上面执行的是带有一个参数的信号传递,两个信号也是一样,只需要添加变量即可:
def run(self,send_msg,send_int): #发射信号 self.sendmsg.emit(send_msg, send_int) def get(self,msg,int): print('QSlot get msg:'+ msg + int)
3.3 自定义信号与自定义槽
from PyQt5.QtWidgets import * from PyQt5.QtCore import pyqtSignal import sys class Winform(QWidget): # 自定义信号,不带参数 btn_clicked_signal = pyqtSignal() def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle('自定义信号/内置槽示例') self.resize(200, 50) btn = QPushButton('关闭', self) # 连接信号与槽1 btn.clicked.connect(self.btn_clicked) # 接收信号,连接到自定义槽函数 # self.btn_clicked_signal.connect(self.close) self.btn_clicked_signal.connect(self.btn_close) def btn_clicked(self): # 自定义信号发送,无参数 self.btn_clicked_signal.emit() def btn_close(self): # 自定义槽函数 self.close() if __name__ == '__main__': app = QApplication(sys.argv) win = Winform() win.show() sys.exit(app.exec_())
自定义的信号:btn_clicked_signal,需要调用btn_clicked()发送信号
自定义的槽:btn_close,内部实际上调用了内置槽函数close()
说实话,这个案例很容易让人混淆 内置和自定义,无论是信号还是槽。