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()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章