python?PyQt5(自定義)信號與槽使用及說明
所謂PyQt5高級自定義信號與槽,指的就是我們可以以自己喜歡的方式定義信號與槽函數(shù),并傳遞參數(shù),自定義信號的一般流程如下
- 定義信號
- 定義槽函數(shù)
- 連接信號與槽函數(shù)
- 發(fā)射信號
1 定義信號
PyQt5通過類成員變量定義信號對象
from PyQt5.QtCore import pyqtSignal # 無參數(shù)的信號 signal1 = pyqtSignal() # 帶一個參數(shù)(整數(shù))的信號 signal2 = pyqtSignal(int) # 帶兩個參數(shù)(整數(shù),字符串)的信號 signal3 = pyqtSignal(int, str) # 帶一個參數(shù)(列表)的信號 signal4 = pyqtSignal(list) # 帶一個參數(shù)(字典)的信號 signal5 = pyqtSignal(dict) # 帶(整數(shù) 字符串)或者(字符串)的信號 signal6 = pyqtSignal([int, str], [str])
2 定義槽函數(shù)
定義一個槽函數(shù),它有多個不同的輸入?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,'第三個') 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 實例
from PyQt5.QtCore import QObject,pyqtSignal class CusSignal(QObject): #無參數(shù)的信號 signal1 = pyqtSignal() #帶一個參數(shù)(整數(shù))的信號 signal2 = pyqtSignal(int) #帶兩個參數(shù)(整數(shù),字符串)的信號 signal3 = pyqtSignal(int,str) #帶一個參數(shù)(列表)的信號 signal4 = pyqtSignal(list) #帶一個參數(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,'第三個') 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()
運行結果:
自定義參數(shù)的傳遞及實例
在pyqt編程過程中,經(jīng)常會遇到給槽函數(shù)傳遞自定義參數(shù)的情況,比如有一個信號與槽函數(shù)的連接是
我們知道對于clicked信號,它是沒有參數(shù)的,對于show_page函數(shù)來說,希望他可以接受參數(shù),希望show_page函數(shù)如下這樣
def show_page(self,name): print(name',點擊了')
于是就會產(chǎn)生一個問題,信號發(fā)出的參數(shù)個數(shù)與槽函數(shù)接受的參數(shù)個數(shù)不一,那么如何解決這個問題呢,這里提供兩種解決方法;
lamdba表達式
使用lambda表達式傳遞按鈕數(shù)字給槽函數(shù),當然還可以傳遞其他東西,甚至是按鈕本身
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))
實例
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 第一種方法 #單擊信號關聯(lián)槽函數(shù),利用Lanbda表達式傳遞一個參數(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)) #實例化窗口 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_())
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
scrapy+scrapyd+gerapy?爬蟲調(diào)度框架超詳細教程
Scrapy吸引人的地方在于它是一個框架,任何人都可以根據(jù)需求方便的修改。它也提供了多種類型爬蟲的基類,如BaseSpider、sitemap爬蟲等,最新版本又提供了web2.0爬蟲的支持,這篇文章主要介紹了scrapy+scrapyd+gerapy?爬蟲調(diào)度框架超詳細教程,需要的朋友可以參考下2022-06-06Python實時監(jiān)控網(wǎng)站瀏覽記錄實現(xiàn)過程詳解
這篇文章主要介紹了Python實時監(jiān)控網(wǎng)站瀏覽記錄實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-07-07Python實現(xiàn)批量將word轉(zhuǎn)換成pdf
這篇文章主要為大家詳細介紹了如何利用Python實現(xiàn)批量將word文檔轉(zhuǎn)換成pdf文件,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學習一下2023-08-08Python利用字節(jié)串或字節(jié)數(shù)組來加載和保存PDF文檔
處理PDF文件的可以直接讀取和寫入文件系統(tǒng)中的PDF文件,然而,通過字節(jié)串(byte string)或字節(jié)數(shù)組(byte array)來加載和保存PDF文檔在某些情況下更高效,本文將介紹如何使用Python通過字節(jié)串或字節(jié)數(shù)組來加載和保存PDF文檔,需要的朋友可以參考下2024-09-09python?實現(xiàn)syslog?服務器的詳細過程
這篇文章主要介紹了python?實現(xiàn)syslog服務器的詳細過程,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08python使用自定義user-agent抓取網(wǎng)頁的方法
這篇文章主要介紹了python使用自定義user-agent抓取網(wǎng)頁的方法,涉及Python使用urllib2模塊操作網(wǎng)頁的技巧,需要的朋友可以參考下2015-04-04