- PyQt 教程
- PyQt - 首页
- PyQt - 简介
- PyQt - 环境搭建
- PyQt - Hello World
- PyQt - 主要类
- PyQt - 使用 Qt Designer
- PyQt - 元对象
- PyQt 信号与槽
- PyQt - 信号和槽
- PyQt - 支持和信号
- PyQt - 未绑定和已绑定信号
- PyQt - 使用 PyQtSignal 创建新的信号
- PyQt - 连接、断开和发射信号
- PyQt - 槽装饰器
- PyQt - 槽连接
- PyQt 布局
- PyQt - 布局管理
- PyQt - QBoxLayout
- PyQt - QGridLayout
- PyQt - QFormLayout
- PyQt - QHBoxLayout
- PyQt - QVBoxLayout
- PyQt - QStackedLayout
- PyQt - QGraphicsGridLayout
- PyQt - QGraphicsAnchorLayout
- PyQt - QGraphicsLayout
- PyQt - QGraphicsLinearLayout
- PyQt 基本控件
- PyQt - 基本控件
- PyQt - QLabel 控件
- PyQt - QLineEdit 控件
- PyQt - QPushButton 控件
- PyQt - QRadioButton 控件
- PyQt - QCheckBox 控件
- PyQt - QComboBox 控件
- PyQt - QSpinBox 控件
- PyQt - QMessageBox
- PyQt - QDialogButtonBox 控件
- PyQt - QFontComboBox 控件
- PyQt - QDoubleSpinBox 控件
- PyQt - QToolBox 控件
- PyQt - QDialog 类
- PyQt - QMessageBox
- PyQt - 多文档界面
- PyQt - 拖放操作
- PyQt 绘图 API
- PyQt - 绘图 API
- PyQt 数据库
- PyQt - 数据库操作
- PyQt 核心知识
- PyQt - BrushStyle 常量
- PyQt - QClipboard
- PyQt - QPixmap 类
- PyQt 有用资源
- PyQt - 快速指南
- PyQt - 有用资源
- PyQt - 讨论
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