python GUI庫圖形界面開發(fā)之PyQt5信號(hào)與槽基礎(chǔ)使用方法與實(shí)例
信號(hào)與槽有三種使用方法
第一種:內(nèi)置信號(hào)與槽的使用
第二種:自定義信號(hào)與槽的使用
第三種:裝飾器的信號(hào)與槽的使用
一: 內(nèi)置信號(hào)與槽的使用
內(nèi)置信號(hào)與槽的使用,是指在發(fā)射信號(hào)時(shí),使用窗口控件的函數(shù),而不是自定義的函數(shù),這種也是我們前面用的最多的,下面簡單的一個(gè)實(shí)例,大家就會(huì)明白
import sys from PyQt5.QtWidgets import QMessageBox,QPushButton,QApplication,QWidget app=QApplication(sys.argv) widget=QWidget() def showMsg(): QMessageBox.information(widget,'信息提示框','Ok 彈出測試信息') btn=QPushButton('測試點(diǎn)擊按鈕',widget) btn.clicked.connect(showMsg) widget.show() sys.exit(app.exec_())
運(yùn)行腳本,顯示效果如下
這個(gè)例子將一個(gè)按鈕對(duì)象的內(nèi)置clicked信號(hào)與自定義槽函數(shù)showMsg()連接,單擊按鈕,就會(huì)觸發(fā)這個(gè)槽函數(shù),彈出一個(gè)信息提示框
二:自定義信號(hào)與槽的使用
自定義信號(hào)與槽的使用,是指在發(fā)射信號(hào)時(shí),不使用窗口控件的函數(shù),而是使用自定義的函數(shù),(簡單的說就是使用oyqtsSignal類實(shí)例發(fā)射信號(hào)),之所以要使用自定義的信號(hào)與槽,是因?yàn)橥ㄟ^內(nèi)置函數(shù)發(fā)射信號(hào)有自身的缺陷,首先,內(nèi)置函數(shù)只包含一些常用地信號(hào),有些信號(hào)發(fā)射找不到對(duì)應(yīng)的內(nèi)置函數(shù),其次在特定的情況下,才能發(fā)射此信號(hào),如按鈕的點(diǎn)擊事件,最后,內(nèi)置函數(shù)傳遞的參數(shù)是特定的,不可以自定義,使用自定義的信號(hào)與槽函數(shù)則沒有這些缺陷
在pyqt5中,自定義信號(hào)與槽的適用很靈活,比如因?yàn)闃I(yè)務(wù)需要,在程序中的某些地方需要發(fā)射一個(gè)信號(hào),傳遞多種數(shù)據(jù),然后在槽函數(shù)接受這些數(shù)據(jù),這樣就可以很靈活的實(shí)現(xiàn)一些業(yè)務(wù)邏輯
簡單的一個(gè)實(shí)例:簡單的自定義信號(hào)與槽
from PyQt5.QtCore import QObject,pyqtSignal #信號(hào)對(duì)象 class QTypeSignal(QObject): #定義一個(gè)信號(hào) # sendmsg = pyqtSignal(object) #todo 優(yōu)化 多個(gè)參數(shù)傳遞 sendmsg=pyqtSignal(str,str) def __init__(self): super(QTypeSignal, self).__init__() def run( self ): #發(fā)射信號(hào) #self.sendmsg.emit('hell') #todo 優(yōu)化 發(fā)射多個(gè)參數(shù) self.sendmsg.emit('第一參數(shù)','第二個(gè)參數(shù)') #槽對(duì)象 class QTypeSlot(QObject): def __init__(self): super(QTypeSlot, self).__init__() #槽對(duì)象中的槽函數(shù) # def get( self,msg ): # print("QSlot get msg => " + msg) #todo 優(yōu)化 多個(gè)參數(shù) def get( self,msg1,msg2 ): print("QSlot get msg => " + msg1+' '+msg2) if __name__ == '__main__': #實(shí)例化信號(hào)對(duì)象 send=QTypeSignal() #實(shí)例化槽對(duì)象 slot=QTypeSlot() #1 print('_____-把信號(hào)綁定到槽函數(shù)上_____') send.sendmsg.connect(slot.get) send.run() print('_____-把信號(hào)與槽函數(shù)解綁_____') send.sendmsg.disconnect(slot.get) send.run()
信號(hào)與槽連接的主要步驟如下
第一步:生成一個(gè)信號(hào)
#定義一個(gè)信號(hào)
# sendmsg = pyqtSignal(object)
#todo 優(yōu)化 多個(gè)參數(shù)傳遞
sendmsg=pyqtSignal(str,str)
第二步:將信號(hào)與槽函數(shù)連接起來
print('_____-把信號(hào)綁定到槽函數(shù)上_____')
send.sendmsg.connect(slot.get)
第三步:槽函數(shù)接受數(shù)據(jù)
def get( self,msg1,msg2 ):
print("QSlot get msg => " + msg1+' '+msg2)
第四步:發(fā)射信號(hào)的實(shí)現(xiàn)
self.sendmsg.emit('第一參數(shù)','第二個(gè)參數(shù)')
第五步:將信號(hào)綁定到槽對(duì)象中的槽函數(shù)上,所以槽函數(shù)能收到所發(fā)射的信號(hào),自此,數(shù)據(jù)傳遞成功,就是這么簡單,如果需要傳遞多個(gè)數(shù)據(jù),可以自定義參數(shù)類型與數(shù)目
send=QTypeSignal()
slot=QTypeSlot()
#
print('_____-把信號(hào)綁定到槽函數(shù)上_____')
send.sendmsg.connect(slot.get)
三:使用裝飾器信號(hào)與槽
1、使用格式
@PyQt5.QtCore.pyqtSlot(參數(shù)) def on_發(fā)送者對(duì)象名稱_發(fā)射信號(hào)名稱(self,參數(shù)): pass
2、注意點(diǎn),使用裝飾器必須定義兩個(gè)東西
QMetaObject.connectSlotsByName(self)
給需要綁定事件的定義一個(gè)id(self.btn.setObjectName('名稱'))
3、按鈕的普通事件
... class Window(QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle('裝飾器信號(hào)與槽') self.resize(500, 500) self.move(400, 200) self.btn = QPushButton('按鈕', self) self.init_ui() def init_ui(self): self.btn.clicked.connect(self.btn_hand) @staticmethod def btn_hand(): print('使用connect點(diǎn)擊了按鈕') ...
4、使用裝飾器后的事件
... class Window(QWidget): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle('裝飾器信號(hào)與槽') self.resize(500, 500) self.move(400, 200) self.btn = QPushButton('按鈕', self) self.init_ui() # 要在加載組件后使用 QMetaObject.connectSlotsByName(self) def init_ui(self): # 這個(gè)地方定義的名字直接在下面使用 self.btn.setObjectName('btn') @pyqtSlot() def on_btn_clicked(self): print('使用裝飾器點(diǎn)擊了按鈕')
本文主要講解了PyQt5信號(hào)與槽基礎(chǔ)使用方法與實(shí)例,更多關(guān)于PyQt5信號(hào)與槽的知識(shí)請(qǐng)查看下面的相關(guān)鏈接
- 詳解PyQt5信號(hào)與槽的幾種高級(jí)玩法
- python GUI庫圖形界面開發(fā)之PyQt5信號(hào)與槽事件處理機(jī)制詳細(xì)介紹與實(shí)例解析
- python GUI庫圖形界面開發(fā)之PyQt5信號(hào)與槽多窗口數(shù)據(jù)傳遞詳細(xì)使用方法與實(shí)例
- python GUI庫圖形界面開發(fā)之PyQt5多線程中信號(hào)與槽的詳細(xì)使用方法與實(shí)例
- python GUI庫圖形界面開發(fā)之PyQt5結(jié)合Qt Designer創(chuàng)建信號(hào)與槽的詳細(xì)方法與實(shí)例
- python GUI庫圖形界面開發(fā)之PyQt5信號(hào)與槽的高級(jí)使用技巧裝飾器信號(hào)與槽詳細(xì)使用方法與實(shí)例
- python GUI庫圖形界面開發(fā)之PyQt5信號(hào)與槽的高級(jí)使用技巧(自定義信號(hào)與槽)詳解與實(shí)例
- python GUI庫圖形界面開發(fā)之PyQt5信號(hào)與槽基本操作
- PyQt5通信機(jī)制 信號(hào)與槽詳解
- PyQt5通過信號(hào)實(shí)現(xiàn)MVC的示例
相關(guān)文章
python turtle工具繪制四葉草的實(shí)例分享
在本篇文章里小編給各位整理的是關(guān)于python turtle工具繪制四葉草的實(shí)例分享,有興趣的朋友們可以跟著學(xué)習(xí)下。2020-02-02使用Python實(shí)現(xiàn)簡單的服務(wù)器功能
socket的使用并不局限于Python語言,你可以用C或者Java來寫出同樣的socket服務(wù)器,而所有語言使用socket的方式都類似(Apache就是使用C實(shí)現(xiàn)的服務(wù)器)2017-08-08Pandas時(shí)間序列:重采樣及頻率轉(zhuǎn)換方式
今天小編就為大家分享一篇Pandas時(shí)間序列:重采樣及頻率轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12PyQt5創(chuàng)建一個(gè)新窗口的實(shí)例
今天小編就為大家分享一篇PyQt5創(chuàng)建一個(gè)新窗口的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-06-06wxpython實(shí)現(xiàn)按鈕切換界面的方法
這篇文章主要為大家詳細(xì)介紹了wxpython實(shí)現(xiàn)按鈕切換界面的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11Python跳出循環(huán)語句continue與break的區(qū)別
這篇文章主要介紹了Python跳出循環(huán)語句continue與break的區(qū)別,本文用實(shí)例來說明它們之間的區(qū)別,簡單易記易懂,需要的朋友可以參考下2014-08-08給Python學(xué)習(xí)者的文件讀寫指南(含基礎(chǔ)與進(jìn)階)
今天,貓貓跟大家一起,好好學(xué)習(xí)Python文件讀寫的內(nèi)容,這部分內(nèi)容特別常用,掌握后對(duì)工作和實(shí)戰(zhàn)都大有益處,學(xué)習(xí)是循序漸進(jìn)的過程,欲速則不達(dá)2020-01-01Pycharm開發(fā)Django項(xiàng)目創(chuàng)建ORM模型的問題
ORM,全稱Object Relational Mapping,通過ORM我們可以通過類的方式去操作數(shù)據(jù)庫,而不用再寫原生的SQL語句,下面通過本文給大家介紹Pycharm開發(fā)Django項(xiàng)目ORM模型介紹,感興趣的朋友一起看看吧2021-10-10