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++ 类型的字符串。此参数作为关键字参数提供。

Explore our latest online courses and learn new skills at your own pace. Enroll and become a certified expert to boost your career.

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