PyQt——自定义信号与槽的高级应用

高级自定义信号与槽

在这里插入图片描述
在这里插入图片描述


from PyQt5.QtCore import QObject , pyqtSignal

class CustSignal(QObject):
      
    # 声明一个无参数的信号
    signal1 = pyqtSignal()
      
    # 声明带一个int类型参数的信号
    signal2 = pyqtSignal(int)
      
    # 声明带一个int和str类型参数的信号
    signal3 = pyqtSignal(int,str)
  
    # 声明带一个列表类型参数的信号
    signal4 = pyqtSignal(list)
  
    # 声明带一个字典类型参数的信号
    signal5 = pyqtSignal(dict)
  
    # 声明一个多重载版本的信号,包括了一个带int和str类型参数的信号或着带str参数的信号
    signal6 = pyqtSignal([int,str], [str])
      
    def __init__(self,parent=None):
        super(CustSignal,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.signalCall6OverLoad)
  
        # 信号发射
        self.signal1.emit()
        self.signal2.emit(1)
        self.signal3.emit(1,"text")
        self.signal4.emit([1,2,3,4])
        self.signal5.emit({"name":"wangwu","age":"25"})
        self.signal6[int,str].emit(1,"text")
        self.signal6[str].emit("text")
          
    def signalCall1(self):
        print("signal1 emit")
  
    def signalCall2(self,val):
        print("signal2 emit,value:",val)
  
    def signalCall3(self,val,text):
        print("signal3 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 signalCall6OverLoad(self,val):
        print("signal6 overload emit,value:",val)
  
if __name__ == '__main__':  
    custSignal = CustSignal()

使用自定义参数

在这里插入图片描述


from PyQt5.QtWidgets import QMainWindow, QPushButton , QWidget , QMessageBox, QApplication, QHBoxLayout
import sys 

class WinForm(QMainWindow):  
	def __init__(self, parent=None):  
		super(WinForm, self).__init__(parent)  
		self.setWindowTitle("信号和槽传递额外参数例子")
		button1 = QPushButton('Button 1')  
		button2 = QPushButton('Button 2')  
        
		button1.clicked.connect(lambda: self.onButtonClick(1)) 
		button2.clicked.connect(lambda: self.onButtonClick(2)) 		

		layout = QHBoxLayout()  
		layout.addWidget(button1)  
		layout.addWidget(button2)  
  
		main_frame = QWidget()  
		main_frame.setLayout(layout)       
		self.setCentralWidget(main_frame)  
  
	def onButtonClick(self, n):  
		print('Button {0} 被按下了'.format(n))  
		QMessageBox.information(self, "信息提示框", 'Button {0} clicked'.format(n))            
  
if __name__ == "__main__":  
	app = QApplication(sys.argv)  
	form = WinForm()  
	form.show()  
	sys.exit(app.exec_())

在这里插入图片描述

from PyQt5.QtWidgets import QMainWindow, QPushButton , QWidget , QMessageBox, QApplication, QHBoxLayout
import sys 
from functools import partial

class WinForm(QMainWindow):  
	def __init__(self, parent=None):  
		super(WinForm, self).__init__(parent)  
		self.setWindowTitle("信号和槽传递额外参数例子")
		button1 = QPushButton('Button 1')  
		button2 = QPushButton('Button 2')  

		button1.clicked.connect(partial(self.onButtonClick, 1))   		
		button2.clicked.connect(partial(self.onButtonClick, 2))   

		layout = QHBoxLayout()  
		layout.addWidget(button1)  
		layout.addWidget(button2)  
  
		main_frame = QWidget()  
		main_frame.setLayout(layout)       
		self.setCentralWidget(main_frame)  
  
	def onButtonClick(self, n):  
		print('Button {0} 被按下了'.format(n))  
		QMessageBox.information(self, "信息提示框", 'Button {0} clicked'.format(n))                 
  
if __name__ == "__main__":  
	app = QApplication(sys.argv)  
	form = WinForm()  
	form.show()  
	sys.exit(app.exec_())

装饰器信号与槽

在这里插入图片描述


from PyQt5 import QtCore 
from PyQt5.QtWidgets import QApplication ,QWidget ,QHBoxLayout , QPushButton
import sys    
    
class CustWidget( QWidget ):
    
    def __init__(self, parent=None):
        super(CustWidget, self).__init__(parent)
        
        self.okButton = QPushButton("OK", self)
        #使用setObjectName设置对象名称
        self.okButton.setObjectName("okButton")        
        layout =  QHBoxLayout()
        layout.addWidget(self.okButton)
        self.setLayout(layout)                
        QtCore.QMetaObject.connectSlotsByName(self)
        
    @QtCore.pyqtSlot()    
    def on_okButton_clicked(self):
        print( "点击了OK按钮")
        
        
if __name__ == "__main__":        
    app =  QApplication(sys.argv)
    win = CustWidget()
    win.show()
    sys.exit(app.exec_())

from PyQt5 import QtCore 
from PyQt5.QtWidgets import QApplication ,QWidget ,QHBoxLayout , QPushButton
import sys    
    
class CustWidget( QWidget ):
    
    def __init__(self, parent=None):
        super(CustWidget, self).__init__(parent)
        
        self.okButton = QPushButton("OK", self)
        #使用setObjectName设置对象名称
        self.okButton.setObjectName("okButton")        
        layout =  QHBoxLayout()
        layout.addWidget(self.okButton)
        self.setLayout(layout)                
        QtCore.QMetaObject.connectSlotsByName(self)
        self.okButton.clicked.connect(self.okButton_clicked)

    def okButton_clicked(self):
        print( "点击了OK按钮")
        
        
if __name__ == "__main__":        
    app =  QApplication(sys.argv)
    win = CustWidget()
    win.show()
    sys.exit(app.exec_())

信号与槽的断开和链接


from PyQt5.QtCore import QObject , pyqtSignal

class SignalClass(QObject):

    # 声明一个无参数的信号
	signal1 = pyqtSignal()

    # 声明带一个int类型参数的信号
	signal2 = pyqtSignal(int)

	def __init__(self,parent=None):
		super(SignalClass,self).__init__(parent)

		# 信号sin1连接到sin1Call和sin2Call这两个槽
		self.signal1.connect(self.sin1Call)
		self.signal1.connect(self.sin2Call)

		# 信号sin2连接到信号sin1
		self.signal2.connect(self.signal1)

        # 信号发射
		self.signal1.emit()
		self.signal2.emit(1)

		# 断开sin1、sin2信号与各槽的连接
		self.signal1.disconnect(self.sin1Call)
		self.signal1.disconnect(self.sin2Call)
		self.signal2.disconnect(self.signal1)

		# 信号sin1和sin2连接同一个槽sin1Call
		self.signal1.connect(self.sin1Call)
		self.signal2.connect(self.sin1Call)

        # 信号再次发射
		self.signal1.emit()
		self.signal2.emit(1)

	def sin1Call(self):
		print("signal-1 emit")

	def sin2Call(self):
		print("signal-2 emit")
  
if __name__ == '__main__':  
	signal = SignalClass()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值