這篇文章給大家分享的是有關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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。