python GUI庫(kù)圖形界面開(kāi)發(fā)之PyQt5信號(hào)與槽的高級(jí)使用技巧(自定義信號(hào)與槽)詳解與實(shí)例
PyQt5信號(hào)與槽高級(jí)自定義信號(hào)與槽
所謂高級(jí)自定義信號(hào)與槽,指的就是我們可以以自己喜歡的方式定義信號(hào)與槽函數(shù),并傳遞參數(shù),自定義信號(hào)的一般流程如下
- 定義信號(hào)
- 定義槽函數(shù)
- 連接信號(hào)與槽函數(shù)
- 發(fā)射信號(hào)
1、定義信號(hào)
通過(guò)類成員變量定義信號(hào)對(duì)象
#無(wú)參數(shù)的信號(hào) signal1=pyqtSignal() #帶一個(gè)參數(shù)(整數(shù))的信號(hào) signal2=pyqtSignal(int) #帶兩個(gè)參數(shù)(整數(shù),字符串)的信號(hào) signal3=pyqtSignal(int,str) #帶一個(gè)參數(shù)(列表)的信號(hào) signal4=pyqtSignal(list) #帶一個(gè)參數(shù)(字典)的信號(hào) signal5=pyqtSignal(dict) #帶(整數(shù) 字符串)或者(字符串)的信號(hào) 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、連接信號(hào)與槽函數(shù)
#信號(hào)與槽函數(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ā)射信號(hào)
#信號(hào)發(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):
#無(wú)參數(shù)的信號(hào)
signal1=pyqtSignal()
#帶一個(gè)參數(shù)(整數(shù))的信號(hào)
signal2=pyqtSignal(int)
#帶兩個(gè)參數(shù)(整數(shù),字符串)的信號(hào)
signal3=pyqtSignal(int,str)
#帶一個(gè)參數(shù)(列表)的信號(hào)
signal4=pyqtSignal(list)
#帶一個(gè)參數(shù)(字典)的信號(hào)
signal5=pyqtSignal(dict)
#帶(整數(shù) 字符串)或者(字符串)的信號(hào)
signal6=pyqtSignal([int,str],[str])
def __init__(self,parent=None):
super(CusSignal, self).__init__(parent)
#信號(hào)與槽函數(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)
#信號(hào)發(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編程過(guò)程中,經(jīng)常會(huì)遇到給槽函數(shù)傳遞自定義參數(shù)的情況,比如有一個(gè)信號(hào)與槽函數(shù)的連接是
button.clicked.connect(show_page)
我們知道對(duì)于clicked信號(hào),它是沒(méi)有參數(shù)的,對(duì)于show_page函數(shù)來(lái)說(shuō),希望他可以接受參數(shù),希望show_page函數(shù)如下這樣
def show_page(self,name):
print(name',點(diǎn)擊了')
于是就會(huì)產(chǎn)生一個(gè)問(wèn)題,信號(hào)發(fā)出的參數(shù)個(gè)數(shù)與槽函數(shù)接受的參數(shù)個(gè)數(shù)不一,那么如何解決這個(gè)問(wèn)題呢,這里提供兩種解決方法;
第一種:lamdba表達(dá)式
第二種:使用functools中的partial函數(shù)
兩種方法,下面均已寫(xiě)上,自己可運(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 第一種方法
#單擊信號(hào)關(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信號(hào)與槽的高級(jí)使用技巧(自定義信號(hào)與槽)詳解與實(shí)例,更多關(guān)于PyQt5信號(hào)與槽知識(shí)請(qǐng)查看下面的相關(guān)鏈接
相關(guān)文章
Python實(shí)現(xiàn)奇數(shù)列與偶數(shù)列調(diào)換的方法詳解
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)df的奇數(shù)列與偶數(shù)列調(diào)換位置,比如A列,B列,調(diào)換成B列,A列,感興趣的小伙伴可以了解一下2022-05-05
Python XML轉(zhuǎn)Json之XML2Dict的使用方法
今天小編就為大家分享一篇Python XML轉(zhuǎn)Json之XML2Dict的使用方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01
這可能是最好玩的python GUI入門實(shí)例(推薦)
這篇文章主要介紹了這可能是最好玩的python GUI入門實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
詳解Python中 sys.argv[]的用法簡(jiǎn)明解釋
本篇文章主要介紹了詳解Python中 sys.argv[]的用法簡(jiǎn)明解釋,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12
Python3爬蟲(chóng)里關(guān)于識(shí)別微博宮格驗(yàn)證碼的知識(shí)點(diǎn)詳解
在本篇文章里小編給大家分享了關(guān)于Python3爬蟲(chóng)里關(guān)于識(shí)別微博宮格驗(yàn)證碼的知識(shí)點(diǎn),有興趣的朋友們可以參考下。2020-07-07
Python代碼庫(kù)之Tuple如何append添加元素問(wèn)題
這篇文章主要介紹了Python代碼庫(kù)之Tuple如何append添加元素問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
PyCharm Terminal終端命令行Shell設(shè)置方式
這篇文章主要介紹了PyCharm Terminal終端命令行Shell設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
Python利用柯里化實(shí)現(xiàn)提高代碼質(zhì)量
柯里化(Currying)是函數(shù)式編程中的一個(gè)重要概念,它可以將一個(gè)多參數(shù)函數(shù)轉(zhuǎn)化為一系列單參數(shù)函數(shù)的組合,本文將詳細(xì)解釋什么是柯里化,如何在Python中實(shí)現(xiàn)柯里化,感興趣的可以了解下2024-01-01

