PyQt 的很多類都內置了信號和槽。下圖是 Qt 官方文檔對 QThread 類中包含的信號/槽的描述:

一、信號/槽 都是內置的
請看一個最簡單的程序: 按鈕點擊后,窗口關閉

代碼:
class Test(QDialog): def __init__(self, parent=None): super().__init__(parent) btn = QPushButton('關閉', self) btn.clicked.connect(self.close) # ①
對語句①的說明:
信號 ==> 槽
信號(btn.clicked)、槽(self.close)都是內置的
作用:按鈕點擊后,窗口關閉
完整代碼:
from PyQt5.QtWidgets import * import sys class Test(QDialog): def __init__(self,parent=None): super().__init__(parent) btn = QPushButton('關閉', self) btn.clicked.connect(self.close) if __name__ == '__main__': app = QApplication(sys.argv) dlg = Test() dlg.show() sys.exit(app.exec_())
二、信號內置、槽自定義
功能同上。
class Test(QDialog): def __init__(self,parent=None): super().__init__(parent) btn = QPushButton('關閉', self) btn.clicked.connect(self.my_close) # ① def my_close(self): # ② 自定義槽 self.close()
對語句①的說明:
信號 ==> 槽
信號(btn.clicked)是內置的、槽(self.my_close)是自定義的
作用:按鈕點擊后,窗口關閉
完整代碼:
from PyQt5.QtWidgets import * import sys class Test(QDialog): def __init__(self,parent=None): super().__init__(parent) btn = QPushButton('關閉', self) btn.clicked.connect(self.my_func) def my_func(self): self.close() if __name__ == '__main__': app = QApplication(sys.argv) dlg = Test() dlg.show() sys.exit(app.exec_())
三、信號是自定義的,槽是內置的
class Test(QDialog): button_clicked_signal = pyqtSignal() # 自定義信號,不帶參 def __init__(self,parent=None): super().__init__(parent) btn = QPushButton('關閉', self) btn.clicked.connect(self.btn_clicked) # ① 信號/槽 self.button_clicked_signal.connect(self.close) # ③接收信號,連接到槽 def btn_clicked(self): self.button_clicked_signal.emit() # ②發送自定義信號,無參
對語句③的說明:
信號 ==> 槽
信號(button_clicked_signal)是自定義的、槽(self.close)是內置的
作用:按鈕點擊后,窗口關閉
附圖說明一下執行順序:

完整代碼:
from PyQt5.QtWidgets import * import sys class Test(QDialog): button_clicked_signal = pyqtSignal() # 自定義信號,不帶參 def __init__(self,parent=None): super().__init__(parent) btn = QPushButton('關閉', self) btn.clicked.connect(self.btn_clicked) # 信號/槽 self.button_clicked_signal.connect(self.close) # 接收信號,連接到槽 def btn_clicked(self): self.button_clicked_signal.emit() # 發送自定義信號,無參 if __name__ == '__main__': app = QApplication(sys.argv) dlg = Test() dlg.show() sys.exit(app.exec_())
四、信號/槽 都是自定義的
class Test(QDialog): button_clicked_signal = pyqtSignal() # 自定義信號,不帶參 def __init__(self,parent=None): super().__init__(parent) btn = QPushButton('關閉', self) btn.clicked.connect(self.btn_clicked) # 信號/槽 self.button_clicked_signal.connect(self.my_close) # 接收信號,連接到槽 def btn_clicked(self): self.button_clicked_signal.emit() # 發送自定義信號,無參 def my_close(self): self.close()
完整代碼:
from PyQt5.QtWidgets import * import sys class Test(QDialog): button_clicked_signal = pyqtSignal() # 自定義信號,不帶參 def __init__(self,parent=None): super().__init__(parent) btn = QPushButton('關閉', self) btn.clicked.connect(self.btn_clicked) # 信號/槽 self.button_clicked_signal.connect(self.my_close) # 接收信號,連接到槽 def btn_clicked(self): self.button_clicked_signal.emit() # 發送自定義信號,無參 def my_close(self): self.close() if __name__ == '__main__': app = QApplication(sys.argv) dlg = Test() dlg.show() sys.exit(app.exec_())
