一.簡介
在 PyQt5 中,自定義訊號是一個常見的任務,通常用於在物件之間傳遞資訊或觸發特定行為。自定義訊號需要繼承自QObject,pyqtSignal並定義其引數型別。
二.操作步驟
1.匯入必要的模組
from PyQt5.QtCore import QObject, pyqtSignal
2.建立自定義訊號
1)繼承自 QObject
2)定義訊號引數的型別
class MyCustomObject(QObject): # 定義一個沒有引數的訊號 signal_without_params = pyqtSignal() # 定義一個帶有字串引數的訊號 signal_with_string_param = pyqtSignal(str)
3.在類中觸發訊號
class MyCustomObject(QObject): # ... 訊號定義 ... def some_method(self, message): # 做一些事情... # 然後觸發帶有字串引數的訊號 self.signal_with_string_param.emit(message)
4.連線訊號(Singnals)到槽(Slots)
# 假設你有一個 MyCustomObject 的例項 my_obj = MyCustomObject() # 連線訊號到槽 def handle_signal(message): print(f"Received message: {message}") my_obj.signal_with_string_param.connect(handle_signal) # 觸發訊號 my_obj.some_method("Hello, PyQt5!")
5.pyqt5常用的訊號
下面列舉幾個常用的訊號
QPushButton.clicked() |
當按鈕被點選時發出 |
QLineEdit.textChanged(str) |
當行編輯框中的文字發生變化時發出,並傳遞新的文字作為引數 |
QCheckBox.stateChanged(int) |
當核取方塊的狀態發生變化時發出,傳遞新的狀態(Qt.Unchecked , Qt.Checked , 或 Qt.PartiallyChecked )作為引數 |
QSpinBox.valueChanged(int) |
當數值框的值發生變化時發出,傳遞新的值作為引數 |
QSlider.valueChanged(int) |
當滑塊的值發生變化時發出,傳遞新的值作為引數。 |
QComboBox.currentIndexChanged(int) |
當下拉選單框的當前索引發生變化時發出,傳遞新的索引作為引數 |
QTimer.timeout() |
當定時器超時時發出。 |
QMouseEvent |
相關的訊號:如 mousePressEvent(QMouseEvent) , mouseReleaseEvent(QMouseEvent) , mouseMoveEvent(QMouseEvent) 等,這些訊號在滑鼠事件發生時由相應的控制元件發出。 |
QKeyEvent |
相關的訊號:如 keyPressEvent(QKeyEvent) , keyReleaseEvent(QKeyEvent) 等,這些訊號在鍵盤事件發生時由相應的控制元件發出。 |
QCloseEvent |
相關的訊號:如 closeEvent(QCloseEvent) ,這個訊號在視窗即將關閉時發出。 |
action.triggered |
QAction 是一個代表使用者介面動作的物件,比如選單項、工具欄按鈕或快捷鍵。triggered 是 QAction 的一個訊號,當這個動作被觸發時(例如,使用者點選了對應的選單項或工具欄按鈕),這個訊號就會被髮出。 |
三.例項
import sys from PyQt5.QtCore import QObject, pyqtSignal from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton, QLineEdit # 自定義訊號 class MyCustomObject(QObject): # 定義一個沒有引數的訊號 signal_without_params = pyqtSignal() # 定義一個帶有字串引數的訊號 signal_with_string_param = pyqtSignal(str) def some_method(self, message): self.signal_with_string_param.emit(message) # 觸發 class FileChooserApp(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.ql = QLineEdit(self) # self.ql.textChanged.connect(self.edit) # 當QLineEdit框內容傳送變化時 self.ql.move(100, 100) self.button = QPushButton("確定", self) self.my_obj = MyCustomObject() self.my_obj.signal_with_string_param.connect(self.edit) # 自定義訊號和槽連線 self.button.clicked.connect(lambda: self.my_obj.some_method("message")) # 點選按鈕觸發自定義訊號 # self.button.clicked.connect(self.my_obj.some_method) # 點選按鈕觸發自定義訊號(無參時寫法) self.setGeometry(500, 500, 250, 180) self.setWindowTitle('textChanged') def edit(self): self.ql.setText("重新輸入") if __name__ == '__main__': app = QApplication(sys.argv) ex = FileChooserApp() ex.show() sys.exit(app.exec_())