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