信號與槽函數(shù)

實例分析

例程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("按鈕被按了")
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末柜蜈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子指巡,更是在濱河造成了極大的恐慌淑履,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件藻雪,死亡現(xiàn)場離奇詭異秘噪,居然都是意外死亡,警方通過查閱死者的電腦和手機阔涉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門缆娃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人瑰排,你說我怎么就攤上這事贯要。” “怎么了椭住?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵崇渗,是天一觀的道長。 經常有香客問我京郑,道長宅广,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任些举,我火速辦了婚禮跟狱,結果婚禮上,老公的妹妹穿的比我還像新娘户魏。我一直安慰自己驶臊,他們只是感情好,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布叼丑。 她就那樣靜靜地躺著关翎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鸠信。 梳的紋絲不亂的頭發(fā)上纵寝,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機與錄音星立,去河邊找鬼爽茴。 笑死,一個胖子當著我的面吹牛贞铣,可吹牛的內容都是我干的闹啦。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼辕坝,長吁一口氣:“原來是場噩夢啊……” “哼窍奋!你這毒婦竟也來了?” 一聲冷哼從身側響起酱畅,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤琳袄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后纺酸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窖逗,經...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年餐蔬,在試婚紗的時候發(fā)現(xiàn)自己被綠了碎紊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佑附。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖仗考,靈堂內的尸體忽然破棺而出音同,到底是詐尸還是另有隱情,我是刑警寧澤秃嗜,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布权均,位于F島的核電站,受9級特大地震影響锅锨,放射性物質發(fā)生泄漏叽赊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一必搞、第九天 我趴在偏房一處隱蔽的房頂上張望必指。 院中可真熱鬧,春花似錦恕洲、人聲如沸取劫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谱邪。三九已至,卻和暖如春庶诡,著一層夾襖步出監(jiān)牢的瞬間惦银,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工末誓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留扯俱,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓喇澡,卻偏偏與公主長得像迅栅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子晴玖,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容