python GUI庫圖形界面開發(fā)之PyQt5信號與槽的高級使用技巧(自定義信號與槽)詳解與實(shí)例
PyQt5信號與槽高級自定義信號與槽
所謂高級自定義信號與槽,指的就是我們可以以自己喜歡的方式定義信號與槽函數(shù),并傳遞參數(shù),自定義信號的一般流程如下
- 定義信號
- 定義槽函數(shù)
- 連接信號與槽函數(shù)
- 發(fā)射信號
1、定義信號
通過類成員變量定義信號對象
#無參數(shù)的信號 signal1=pyqtSignal() #帶一個(gè)參數(shù)(整數(shù))的信號 signal2=pyqtSignal(int) #帶兩個(gè)參數(shù)(整數(shù),字符串)的信號 signal3=pyqtSignal(int,str) #帶一個(gè)參數(shù)(列表)的信號 signal4=pyqtSignal(list) #帶一個(gè)參數(shù)(字典)的信號 signal5=pyqtSignal(dict) #帶(整數(shù) 字符串)或者(字符串)的信號 signal6=pyqtSignal([int,str],[str])
2、定義槽函數(shù)
定義一個(gè)槽函數(shù),它有多個(gè)不同的輸入?yún)⑤敂?shù)
def signalCall1( self ): print("signal1 emit") def signalCall2( self,val ): print('signal2 emit,value:',val) def signalCall3( self,val,text ): print('signall3 emit,value:',val,text) def signalCall4( self,val ): print('signal4 emit,value:',val) def signalCall5( self,val ): print('signal5 emit,value',val) def signalCall6( self,val,text ): print('signal6 emit,value',val,text) def signalCall7( self,val ): print('signal6 ovetload emit',val)
3、連接信號與槽函數(shù)
#信號與槽函數(shù)的鏈接 self.signal1.connect(self.signalCall1) self.signal2.connect(self.signalCall2) self.signal3.connect(self.signalCall3) self.signal4.connect(self.signalCall4) self.signal5.connect(self.signalCall5) self.signal6[int,str].connect(self.signalCall6) self.signal6[str].connect(self.signalCall7)
4、發(fā)射信號
#信號發(fā)射 self.signal1.emit() self.signal2.emit(1) self.signal3.emit(1,'第三個(gè)') self.signal4.emit([1,2,3,4]) self.signal5.emit({"name":'JIA','age':'21'}) self.signal6[int,str].emit(1,"第六") self.signal6[str].emit('第六')
5、實(shí)例
完整代碼如下
from PyQt5.QtCore import QObject,pyqtSignal class CusSignal(QObject): #無參數(shù)的信號 signal1=pyqtSignal() #帶一個(gè)參數(shù)(整數(shù))的信號 signal2=pyqtSignal(int) #帶兩個(gè)參數(shù)(整數(shù),字符串)的信號 signal3=pyqtSignal(int,str) #帶一個(gè)參數(shù)(列表)的信號 signal4=pyqtSignal(list) #帶一個(gè)參數(shù)(字典)的信號 signal5=pyqtSignal(dict) #帶(整數(shù) 字符串)或者(字符串)的信號 signal6=pyqtSignal([int,str],[str]) def __init__(self,parent=None): super(CusSignal, self).__init__(parent) #信號與槽函數(shù)的鏈接 self.signal1.connect(self.signalCall1) self.signal2.connect(self.signalCall2) self.signal3.connect(self.signalCall3) self.signal4.connect(self.signalCall4) self.signal5.connect(self.signalCall5) self.signal6[int,str].connect(self.signalCall6) self.signal6[str].connect(self.signalCall7) #信號發(fā)射 self.signal1.emit() self.signal2.emit(1) self.signal3.emit(1,'第三個(gè)') self.signal4.emit([1,2,3,4]) self.signal5.emit({"name":'JIA','age':'21'}) self.signal6[int,str].emit(1,"第六") self.signal6[str].emit('第六') #槽函數(shù) def signalCall1( self ): print("signal1 emit") def signalCall2( self,val ): print('signal2 emit,value:',val) def signalCall3( self,val,text ): print('signall3 emit,value:',val,text) def signalCall4( self,val ): print('signal4 emit,value:',val) def signalCall5( self,val ): print('signal5 emit,value',val) def signalCall6( self,val,text ): print('signal6 emit,value',val,text) def signalCall7( self,val ): print('signal6 ovetload emit',val) if __name__ == '__main__': custSignal=CusSignal()
運(yùn)行結(jié)果如下
自定義參數(shù)的傳遞
在pyqt編程過程中,經(jīng)常會遇到給槽函數(shù)傳遞自定義參數(shù)的情況,比如有一個(gè)信號與槽函數(shù)的連接是
button.clicked.connect(show_page)
我們知道對于clicked信號,它是沒有參數(shù)的,對于show_page函數(shù)來說,希望他可以接受參數(shù),希望show_page函數(shù)如下這樣
def show_page(self,name):
print(name',點(diǎn)擊了')
于是就會產(chǎn)生一個(gè)問題,信號發(fā)出的參數(shù)個(gè)數(shù)與槽函數(shù)接受的參數(shù)個(gè)數(shù)不一,那么如何解決這個(gè)問題呢,這里提供兩種解決方法;
第一種:lamdba表達(dá)式
第二種:使用functools中的partial函數(shù)
兩種方法,下面均已寫上,自己可運(yùn)行查看,注意注釋
實(shí)例如下
import sys from PyQt5.QtWidgets import * from functools import partial class WinForm(QMainWindow): def __init__(self,parent=None): super(WinForm, self).__init__(parent) #實(shí)例化兩個(gè)按鈕 button1=QPushButton('Button1') button2=QPushButton('Button2') #todo 第一種方法 #單擊信號關(guān)聯(lián)槽函數(shù),利用Lanbda表達(dá)式傳遞一個(gè)參數(shù) # button1.clicked.connect(lambda :self.onButtonClick(1)) # button2.clicked.connect(lambda :self.onButtonClick(2)) # #todo 第二種方法 button1.clicked.connect(partial(self.onButtonClick, 1)) button2.clicked.connect(partial(self.onButtonClick, 2)) #實(shí)例化窗口 main=QWidget() #設(shè)置窗口的布局,并向其中添加控件 layout=QHBoxLayout(main) layout.addWidget(button1) layout.addWidget(button2) #設(shè)置為中央控件 self.setCentralWidget(main) def onButtonClick( self,n ): #彈窗信息提示框,輸出被點(diǎn)擊的信息 print("Button {0}".format(n)) QMessageBox.information(self,'信息提示框','Button {0}'.format(n)) if __name__ == '__main__': app=QApplication(sys.argv) form=WinForm() form.show() sys.exit(app.exec_())
運(yùn)行效果如圖所示
代碼分析
重點(diǎn)解釋
使用lambda表達(dá)式傳遞按鈕數(shù)字給槽函數(shù),當(dāng)然還可以傳遞其他東西,甚至是按鈕本身
button1.clicked.connect(lambda :self.onButtonClick(1))
button2.clicked.connect(lambda :self.onButtonClick(2))
另一種方法是使用functools中的partial函數(shù)
button1.clicked.connect(partial(self.onButtonClick, 1))
button2.clicked.connect(partial(self.onButtonClick, 2))
本文主要介紹了PyQt5信號與槽的高級使用技巧(自定義信號與槽)詳解與實(shí)例,更多關(guān)于PyQt5信號與槽知識請查看下面的相關(guān)鏈接
相關(guān)文章
python美多商城項(xiàng)目開發(fā)小結(jié)
這篇文章主要介紹了python美多商城項(xiàng)目開發(fā)小結(jié),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02一款Python工具制作的動態(tài)條形圖(強(qiáng)烈推薦!)
有時(shí)為了方便看數(shù)據(jù)的變化情況,需要畫一個(gè)動態(tài)圖來看整體的變化情況,下面這篇文章主要給大家介紹了一款Python工具制作的動態(tài)條形圖的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02Python 利用郵件系統(tǒng)完成遠(yuǎn)程控制電腦的實(shí)現(xiàn)(關(guān)機(jī)、重啟等)
這篇文章主要介紹了Python 利用郵件系統(tǒng)完成遠(yuǎn)程控制電腦(關(guān)機(jī)、重啟等),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11python3+PyQt5實(shí)現(xiàn)使用剪貼板做復(fù)制與粘帖示例
本篇文章主要介紹了python3+PyQt5實(shí)現(xiàn)使用剪貼板做復(fù)制與粘帖示例,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01