PyQt5自定義訊號

余生没有余生發表於2024-05-15

一.簡介

在 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 是一個代表使用者介面動作的物件,比如選單項、工具欄按鈕或快捷鍵。triggeredQAction 的一個訊號,當這個動作被觸發時(例如,使用者點選了對應的選單項或工具欄按鈕),這個訊號就會被髮出。

三.例項

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_())

相關文章