PyQt - 连接、断开和发射信号



将信号连接到槽

在 PyQt 中,使用绑定信号的 **connect()** 函数将信号连接到槽。当信号成功连接到槽时,connect() 方法返回一个 **Connection** 对象。它也可以稍后断开连接。如果连接建立失败,将引发异常。

连接信号的语法和参数

连接信号传递的语法和参数如下所示:

connect(slot[, type=PyQt5.QtCore.Qt.AutoConnection[, no_receiver_check=False]]) → PyQt5.QtCore.QMetaObject.Connection

传递的参数具有不同的用途,如下所示:

  • **slot** - 它指定要连接信号的槽。它可以是 Python 可调用对象或另一个绑定信号。
  • **type** - 要建立的连接的类型。默认情况下,它设置为 AutoConnection,这意味着 PyQt 将确定最合适的连接类型。
  • **no_receiver_check** - 这是一个可选参数,用于抑制对底层 C++ 接收器实例是否仍然存在的检查,并无论如何传递信号。

连接信号的示例

在此示例中,定义了一个名为 **Foo** 的类,该类具有一个信号 **trigger**。然后使用方法 **connect_and_emit_trigger()** 将触发信号连接到槽 **handle_trigger**。

from PyQt6.QtCore import QObject, pyqtSignal

class Foo(QObject):
   trigger = pyqtSignal()

   def connect_and_emit_trigger(self):
      self.trigger.connect(self.handle_trigger)
      self.trigger.emit()

   def handle_trigger(self):
      print("Trigger signal received")

foo = Foo()
foo.connect_and_emit_trigger()

输出

Trigger signal received

从槽断开信号

可以使用绑定信号的 **disconnect()** 方法从槽断开信号。如果槽未连接到信号或信号根本没有连接,则会引发异常。

断开信号的语法和参数

disconnect([slot])

这里,**slot** 是一个可选参数,它指定要断开的槽。如果未传递,则断开连接到信号的所有槽。

断开信号的示例

在此示例中,我们定义了一个名为 Bar 的类,该类具有一个信号 trigger 和一个方法 connect_and_disconnect_trigger(),用于将信号连接到槽 handle_trigger()。当调用 connect_and_disconnect_trigger() 时,它将 trigger 信号连接到 **handle_trigger()** 槽,发出信号,打印 **“Trigger signal received”**,然后断开槽的连接。

from PyQt6.QtCore import QObject, pyqtSignal

class Bar(QObject):
   trigger = pyqtSignal()

   def connect_and_disconnect_trigger(self):
      self.trigger.connect(self.handle_trigger)
      self.trigger.emit()
      self.trigger.disconnect(self.handle_trigger)

   def handle_trigger(self):
      print("Trigger signal received")

bar = Bar()
bar.connect_and_disconnect_trigger()

输出

Trigger signal received

发射信号

使用绑定信号的 **emit()** 方法发射信号。

发射信号的语法和参数

emit(*args)

这里,**args** 是一个可选参数序列,用于传递给任何连接的槽。

发射信号的示例

在此示例中,定义了一个名为 **Baz** 的类,该类包含一个信号 **trigger**。然后我们将 **trigger** 信号连接到槽 **handle_trigger()** 并以值 **42** 发出信号。当连接的槽接收到此值时,它会打印 **Trigger signal received with value: 42** 作为输出。

from PyQt5.QtCore import QObject, pyqtSignal

class Baz(QObject):
   trigger = pyqtSignal(int)

   def emit_trigger(self):
      self.trigger.emit(42)

   def handle_trigger(self, value):
      print("Trigger signal received with value:", value)

baz = Baz()
baz.trigger.connect(baz.handle_trigger)
baz.emit_trigger()

输出

Trigger signal received with value: 42
广告