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

© . All rights reserved.