pyqtSlot() 装饰器



在 PyQt 中,**pyqtSlot()** 装饰器允许将 Python 方法显式标记为 Qt 槽,并可以定义其 C++ 签名。本章我们将了解 **pyqtSlot()** 装饰器的运行机制、参数及其用法。

pyqtSlot() 装饰器简介

在 PyQt 中,它使任何 Python 可调用对象都能在连接到信号时充当槽。在某些情况下,需要显式地将 Python 方法定义为 Qt 槽。我们可以使用 **pyqtSlot()** 函数装饰器来实现。它可以显式地将 Python 方法标记为 Qt 槽,并提供一种指定其 C++ 签名的方法。

语法和参数

**pyqtSlot()** 装饰器的语法如下:

PyQt5.QtCore.pyqtSlot(types[, name[, result[, revision=0]]])

传递给 pyqtSlot() 函数的不同参数具有不同的作用:

  • **types** - 它定义构成槽的 C++ 签名的类型。每个类型可以是 Python 类型对象或表示 C++ 类型的字符串。
  • **name:(可选)** - 它指定对 C++ 可见的槽的名称。如果省略,则使用装饰的 Python 方法的名称。此参数作为关键字参数提供。
  • **revision:(可选)** - 表示导出到 QML 的槽的版本。此参数作为关键字参数指定。
  • **result:(可选)** - 指示结果的类型。它可以是 Python 类型对象或指定 C++ 类型的字符串。此参数作为关键字参数提供。

pyqtSlot() 装饰器的优点

使用 pyqtSlot() 装饰器将信号连接到装饰的 Python 方法具有以下几个优点:

  • 它通过减少内存使用来提高内存效率。
  • 它还可以稍微提高性能,并使信号连接更快。

示例 1:使用 pyqtSlot() 装饰器定义简单的槽

在这个例子中,我们定义一个继承自 **QObject** 的类 **Foo**。在 Foo 中,我们声明一个方法 foo() 并用 **@pyqtSlot()** 装饰它,表明它是一个 Qt 槽。此槽不接受任何参数。当创建 Foo 的实例并调用 foo() 时,它会打印一条消息,表明该槽已被调用。

from PyQt5.QtCore import QObject, pyqtSlot

class Foo(QObject):

   @pyqtSlot()
   def foo(self):
      print("Simple slot foo() called")

# Create an instance of Foo
foo_instance = Foo()

# Call the slot
foo_instance.foo()

输出

Simple slot foo() called

示例 2:使用 pyqtslot() 装饰器创建带多个参数的槽

在这个例子中,我们定义一个继承自 QObject 的类 **Foo**。方法 **foo()** 用 **@pyqtSlot(int, str)** 装饰,指定它是一个接受整数和字符串作为参数的槽。当此槽用适当的参数调用时,它会打印一条消息以及所提供参数的值。

from PyQt5.QtCore import QObject, pyqtSlot

class Foo(QObject):

   @pyqtSlot(int, str)
   def foo(self, arg1, arg2):
      print("Slot foo() called with arguments:", arg1, arg2)

# Create an instance of Foo
foo_instance = Foo()

# Call the slot
foo_instance.foo(10, "Hello")

输出

Slot foo() called with arguments: 10 Hello

示例 3:指定名称和结果的槽

在这个例子中,在类 **Foo** 中,我们将方法 **foo()** 定义为一个槽,并用 **@pyqtSlot(int, name='bar')** 装饰它。这定义了一个名为 **bar()** 的槽,它接受一个整数参数。当用整数参数调用时,它会打印一条消息,表明 bar() 槽已被调用以及所提供的参数。

from PyQt5.QtCore import QObject, pyqtSlot

class Foo(QObject):

   @pyqtSlot(int, name='bar')
   def foo(self, arg1):
      print("Slot bar() called with argument:", arg1)

# Create an instance of Foo
foo_instance = Foo()

# Call the slot
foo_instance.foo(20)

输出

Slot bar() called with argument: 20
广告