網(wǎng)站首頁 編程語言 正文
所謂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_())
總結
原文鏈接:https://blog.csdn.net/weixin_45928096/article/details/126928975
相關推薦
- 2023-04-21 深入理解Python中__init__.py文件_python
- 2022-09-07 Python的flask常用函數(shù)route()_python
- 2022-12-06 Python中八種數(shù)據(jù)導入方法總結_python
- 2022-06-17 Ruby信號處理詳解_ruby專題
- 2022-04-04 切換路由時如何關閉上一個頁面的所有請求-axios cancelToken
- 2022-06-28 python神經(jīng)網(wǎng)絡使用tensorflow實現(xiàn)自編碼Autoencoder_python
- 2022-05-25 RedisTemplate實現(xiàn)setnx分布式鎖
- 2022-12-02 Android?Flutter實現(xiàn)自由落體彈跳動畫效果_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支