實例分析
例程1:
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from Ui_MainSignalSlog02 import Ui_Form
from PyQt5.QtCore import pyqtSignal, Qt
class MyMainWindow(QMainWindow, Ui_Form):
#第一步,創(chuàng)建信號
#創(chuàng)建一個字符串參數(shù)的信號
helpSignal = pyqtSignal(str)
#創(chuàng)建一個列表參數(shù)的信號
printSignal = pyqtSignal(list)
#創(chuàng)建一個重載信號围段,參數(shù)為(整型佛寿,字符串類型)或者(字符串類型)
previewSignal = pyqtSignal([int, str], [str])
def __init__(self):
super().__init__()
self.setupUi(self)
self.initUI()
def initUI(self):
#第二步短曾,綁定信號與槽函數(shù)
#將信號綁定到槽函數(shù)
#信號helpSignal <-->槽函數(shù)showHelpMessage
self.helpSignal.connect(self.showHelpMessage)
#信號printSignal <-->槽函數(shù)printPaper
self.printSignal.connect(self.printPaper)
#信號previewSignal[str] <-->槽函數(shù)previewPaper
self.previewSignal[str].connect(self.previewPaper)
#信號previewSignal[int, str] <-->槽函數(shù)previewPaperWithArgs
self.previewSignal[int, str].connect(self.previewPaperWithArgs)
#將按鈕printButton的點擊信號綁定到槽函數(shù)emitPrintSignal
self.printButton.clicked.connect(self.emitPrintSignal)
#將按鈕previewButton的點擊信號綁定到槽函數(shù)emitPreviewSignal
self.previewButton.clicked.connect(self.emitPreviewSignal)
#第三步键畴,槽函數(shù)的定義
def emitPreviewSignal(self):
if self.previewStatus.isChecked()==True:
self.previewSignal[int, str].emit(1080, " Full Screen")
elif self.previewStatus.isChecked()==False:
self.previewSignal[str].emit("Preview")
def emitPrintSignal(self):
pList = []
pList.append(self.numberSpinBox.value())
pList.append(self.styleCombo.currentText())
#第四步越除,發(fā)送信號棒坏,帶參數(shù)的信號
self.printSignal.emit(pList) #發(fā)射printSignal信號臭挽,傳遞參數(shù)pList
def printPaper(self, list):
self.resultLabel.setText("打印分數(shù):"+str(list[0])+" 紙張:"+str(list[1]))
def previewPaper(self, text):
self.resultLabel.setText(text)
def previewPaperWithArgs(self, style, text):
self.resultLabel.setText(str(style)+text)
def showHelpMessage(self, message):
self.resultLabel.setText(message) #label標簽顯示message
self.statusBar().showMessage(message)#狀態(tài)欄顯示message
def keyPressEvent(self, event): #將事件傳遞進來
if event.key()==Qt.Key_F1: #按鍵事件八匠,比較按鍵是否為F1
self.helpSignal.emit("help message")#如果key==F1絮爷,觸發(fā)信號helpSignal發(fā)送消息
if __name__ =="__main__":
app = QApplication(sys.argv)
win = MyMainWindow()
win.show()
sys.exit(app.exec_())
例程2:
from PyQt5.QtCore import QObject, pyqtSignal
#信號對象,用于創(chuàng)建信號梨树,和發(fā)射信號
class QTypeSignal(QObject):
sendmsg = pyqtSignal(str, str) #定義一個信號
def __init__(self):
super().__init__()
def run(self):
#對象.信號.發(fā)射(消息1, 消息2)
self.sendmsg.emit('Hello','PyQt5') #發(fā)射一個信號
#槽函數(shù)對象坑夯,用于創(chuàng)建槽函數(shù),接收信號發(fā)射的消息
class QTpyeSlot(QObject):
def __init__(self):
super().__init__()
#定義槽函數(shù)抡四,接收信號發(fā)過來的消息
def get(self, msg1, msg2):
print("QSlot get msg =>"+msg1+' '+msg2)
if __name__ == "__main__":
send = QTypeSignal()
slot = QTpyeSlot()
print("綁定信號與槽函數(shù)")
#綁定信號與槽函數(shù) --- 對象.信號.連接(槽函數(shù))
send.sendmsg.connect(slot.get)
#發(fā)射信號
send.run()
print("把信號和槽函數(shù)連接斷開")
send.sendmsg.disconnect(slot.get)
send.run()
運行結果:
>>> 綁定信號與槽函數(shù)
QSlot get msg =>Hello PyQt5
把信號和槽函數(shù)連接斷開
裝飾器信號與槽函數(shù)
使用方法:
@PyQt5.QtCore.pyqtSlot(參數(shù))
def on_發(fā)送者對象名稱_發(fā)射信號名稱(self, 參數(shù)):
pass
生效的前提:是下面這條語句被執(zhí)行
PyQt5.QtCore.QMetaObject.connectSlotsByName(QObject)
舉例說明:
@PyQt5.pyqtSlot()
def on_okBtn_clicked(self):
print("按鈕被按了")
等效于:
def __init__(self):
self.okBtn.clicked.connect(self.okBtn_clicked)
def okBtn_clicked(self):
print("按鈕被按了")