——學習《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(int\float),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()
說實話,這個案例很容易讓人混淆 內置和自定義,無論是信號還是槽。