您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關python中GUI庫圖形界面開發之PyQt5信號與槽怎么用的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
所謂高級自定義信號與槽,指的就是我們可以以自己喜歡的方式定義信號與槽函數,并傳遞參數,自定義信號的一般流程如下
定義信號
定義槽函數
連接信號與槽函數
發射信號
通過類成員變量定義信號對象
#無參數的信號 signal1=pyqtSignal() #帶一個參數(整數)的信號 signal2=pyqtSignal(int) #帶兩個參數(整數,字符串)的信號 signal3=pyqtSignal(int,str) #帶一個參數(列表)的信號 signal4=pyqtSignal(list) #帶一個參數(字典)的信號 signal5=pyqtSignal(dict) #帶(整數 字符串)或者(字符串)的信號 signal6=pyqtSignal([int,str],[str])
定義一個槽函數,它有多個不同的輸入參輸數
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)
#信號與槽函數的鏈接 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)
#信號發射 self.signal1.emit() self.signal2.emit(1) self.signal3.emit(1,'第三個') self.signal4.emit([1,2,3,4]) self.signal5.emit({"name":'JIA','age':'21'}) self.signal6[int,str].emit(1,"第六") self.signal6[str].emit('第六')
完整代碼如下
from PyQt5.QtCore import QObject,pyqtSignal class CusSignal(QObject): #無參數的信號 signal1=pyqtSignal() #帶一個參數(整數)的信號 signal2=pyqtSignal(int) #帶兩個參數(整數,字符串)的信號 signal3=pyqtSignal(int,str) #帶一個參數(列表)的信號 signal4=pyqtSignal(list) #帶一個參數(字典)的信號 signal5=pyqtSignal(dict) #帶(整數 字符串)或者(字符串)的信號 signal6=pyqtSignal([int,str],[str]) def __init__(self,parent=None): super(CusSignal, self).__init__(parent) #信號與槽函數的鏈接 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) #信號發射 self.signal1.emit() self.signal2.emit(1) self.signal3.emit(1,'第三個') self.signal4.emit([1,2,3,4]) self.signal5.emit({"name":'JIA','age':'21'}) self.signal6[int,str].emit(1,"第六") self.signal6[str].emit('第六') #槽函數 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()
運行結果如下
在pyqt編程過程中,經常會遇到給槽函數傳遞自定義參數的情況,比如有一個信號與槽函數的連接是
button.clicked.connect(show_page)
我們知道對于clicked信號,它是沒有參數的,對于show_page函數來說,希望他可以接受參數,希望show_page函數如下這樣
def show_page(self,name):
print(name',點擊了')
于是就會產生一個問題,信號發出的參數個數與槽函數接受的參數個數不一,那么如何解決這個問題呢,這里提供兩種解決方法;
第一種:lamdba表達式
第二種:使用functools中的partial函數
兩種方法,下面均已寫上,自己可運行查看,注意注釋
實例如下
import sys from PyQt5.QtWidgets import * from functools import partial class WinForm(QMainWindow): def __init__(self,parent=None): super(WinForm, self).__init__(parent) #實例化兩個按鈕 button1=QPushButton('Button1') button2=QPushButton('Button2') #todo 第一種方法 #單擊信號關聯槽函數,利用Lanbda表達式傳遞一個參數 # 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)) #實例化窗口 main=QWidget() #設置窗口的布局,并向其中添加控件 layout=QHBoxLayout(main) layout.addWidget(button1) layout.addWidget(button2) #設置為中央控件 self.setCentralWidget(main) def onButtonClick( self,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_())
運行效果如圖所示
代碼分析
重點解釋
使用lambda表達式傳遞按鈕數字給槽函數,當然還可以傳遞其他東西,甚至是按鈕本身
button1.clicked.connect(lambda :self.onButtonClick(1))
button2.clicked.connect(lambda :self.onButtonClick(2))
另一種方法是使用functools中的partial函數
button1.clicked.connect(partial(self.onButtonClick, 1))
button2.clicked.connect(partial(self.onButtonClick, 2))
感謝各位的閱讀!關于“python中GUI庫圖形界面開發之PyQt5信號與槽怎么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。