高級自定義信號與槽
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()