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
廣告

© . All rights reserved.