- PyQt 教程
- PyQt - 首頁
- PyQt - 簡介
- PyQt - 環境搭建
- PyQt - Hello World
- PyQt - 主要類
- PyQt - 使用 Qt Designer
- PyQt - 元物件
- PyQt 訊號與槽
- PyQt - 訊號和槽
- PyQt - 支援和訊號
- PyQt - 未繫結訊號和繫結訊號
- PyQt - 使用 PyQtSignal 建立新訊號
- PyQt - 連線、斷開和發射訊號
- PyQt - 槽裝飾器
- PyQt - 槽連線
- PyQt 佈局
- PyQt - 佈局管理
- PyQt - QBoxLayout
- PyQt - QGridLayout
- PyQt - QFormLayout
- PyQt - QHBoxLayout
- PyQt - QVBoxLayout
- PyQt - QStackedLayout
- PyQt - QGraphicsGridLayout
- PyQt - QGraphicsAnchorLayout
- PyQt - QGraphicsLayout
- PyQt - QGraphicsLinearLayout
- PyQt 基礎部件
- PyQt - 基礎部件
- PyQt - QLabel 部件
- PyQt - QLineEdit 部件
- PyQt - QPushButton 部件
- PyQt - QRadioButton 部件
- PyQt - QCheckBox 部件
- PyQt - QComboBox 部件
- PyQt - QSpinBox 部件
- PyQt - QMessageBox
- PyQt - QDialogButtonBox 部件
- PyQt - QFontComboBox 部件
- PyQt - QDoubleSpinBox 部件
- PyQt - QToolBox 部件
- PyQt - QDialog 類
- PyQt - QMessageBox
- PyQt - 多文件介面
- PyQt - 拖放操作
- PyQt 繪圖 API
- PyQt - 繪圖 API
- PyQt 資料庫
- PyQt - 資料庫處理
- PyQt 核心知識
- PyQt - BrushStyle 常量
- PyQt - QClipboard
- PyQt - QPixmap 類
- PyQt 有用資源
- PyQt - 快速指南
- PyQt - 有用資源
- PyQt - 討論
PyQt - 未繫結訊號和繫結訊號
在 PyQt 中,**未繫結訊號**是類級別的屬性,定義了訊號的特性,而**繫結訊號**則與特定例項相關聯,可以連線到槽併發射以觸發 GUI 中的動作。在本章中,我們將瞭解 PyQt 中未繫結訊號和繫結訊號的概念。
未繫結訊號
在 PyQt 中,未繫結訊號基本上是類屬性。當我們在類中定義訊號時,它最初是未繫結的。這意味著訊號與類的任何特定例項都不相關聯。它作為稍後建立繫結訊號的藍圖。
示例:未繫結訊號
在此示例中,my_signal 最初是一個未繫結訊號,因為它最初是類屬性,直到建立類物件。然後我們建立一個 MyObject 的例項,並將 lambda 函式連線到訊號。當訊號以值 42 發射時,連線的 lambda 函式將被執行,並將“Received value: 42”列印到控制檯。
from PyQt5.QtCore import QObject, pyqtSignal
class MyObject(QObject):
# Define an unbound signal
my_signal = pyqtSignal(int)
obj = MyObject() # Create an instance of MyObject
obj.my_signal.connect(lambda value: print(f"Received value: {value}"))
# Emit the signal
obj.my_signal.emit(42)
輸出
Received value: 42
繫結訊號
在 PyQt 中,繫結訊號與類的特定例項相關聯。當我們將未繫結訊號作為例項的屬性引用時,PyQt 會自動將例項繫結到訊號。此繫結過程類似於 Python 如何從類函式建立繫結方法。
繫結訊號中的方法
繫結訊號使用一些函式來促進其使用 -
- **connect()** - 此方法用於將槽連線到訊號。槽是響應訊號發射而呼叫的函式或方法。
- **disconnect()** - 此函式用於斷開先前連線的槽與訊號的連線。
- **emit()** - 此方法發射訊號,觸發任何連線的槽執行。
繫結訊號具有 signal 屬性,該屬性表示訊號的簽名。
示例:斷開槽連線
在此示例中,我們首先將槽連線到訊號,發射訊號,然後斷開槽連線。當訊號再次發射時,先前連線的槽將不再被呼叫。
class MyObject(QObject):
# Define a signal
my_signal = pyqtSignal(int)
obj = MyObject() # Create an instance of MyObject
slot = lambda value: print(f"Received value: {value}")
obj.my_signal.connect(slot)
# Emit the signal
obj.my_signal.emit(42)
# Disconnect the slot
obj.my_signal.disconnect(slot)
# Emit the signal again
obj.my_signal.emit(100)
輸出
Received value: 42
過載訊號
在 PyQt 中,當訊號支援多個簽名時,則稱該訊號為過載訊號。每個簽名對應於一組特定的引數型別。要選擇過載訊號的特定簽名,我們可以使用所需的簽名索引訊號。
簽名是一系列型別,其中每個型別可以是 Python 型別物件或表示 C++ 型別的字串。PyQt 自動規範化 C++ 型別名稱,以確保一致性和易用性。
示例:過載訊號
在此示例中,my_signal 被過載以支援整數和字串引數。我們連線不同的槽來處理每種型別的引數,並使用相應的值發射訊號。
class MyObject(QObject):
# Define an overloaded signal
my_signal = pyqtSignal([int], [str])
obj = MyObject() # Create an instance of MyObject
obj.my_signal[int].connect(lambda value: print(f"Received integer value: {value}"))
obj.my_signal[str].connect(lambda value: print(f"Received string value: {value}"))
# Emit the signal with different types of arguments
obj.my_signal[int].emit(42)
obj.my_signal[str].emit("Hello PyQt")
輸出
Received integer value: 42 Received string value: Hello PyQt
廣告