1. 系列前言
  2. 语法
    1. Signal
    2. Slot

系列前言

PySide 官方文档太垃圾,语法参考只有一句“与 PyQt5 兼容”就没了,因此记录一下官方文档模糊的地方以备查阅。

不过 2022 年还在学 PySide2 是不是有点落后了?

语法

Signal

Signal 的使用语法在 PySide2 和 PyQt5 中相似(在 PyQt5 中这个类叫 pyqtSignal):

以下内容部分翻译自 PyQt5 的文档

PySide2.QtCore.Signal(*types, /, name=..., revision=0, arguments=...)
'''创建一个或多个重载的未绑定信号作为类属性。

参数:
- types - 定义可发送信号的类型,可以直接传入 Python 类或传入 C++ 类名称的字符串。
或者可以传入序列,序列中指定的类型将作为该信号的重载,第一个序列作为重载的默认值。
- name - 信号的名称。如果省略,则使用类属性的名称。关键字参数。
- revision - 导出到 QML 的信号的修订。关键字参数。
- arguments - 导出到 QML 的信号参数名称的序列。关键字参数。
返回类型:未绑定的信号
'''

用法:

from PySide2.QtCore import QObject, Signal

class Foo(QObject):

# 定义了一个 closed 信号,不接受任何参数
closed = Signal()

# 定义了一个 rangeChanged 信号,接受两个 int 参数
# 在使用 range_changed.emit() 发送信号时,应该传入两个 int 型参数
range_changed = Signal(int, int, name='rangeChanged')

# 定义了一个 valueChanged 信号,这个信号有两个重载,
# 一个接受一个 int 型参数,另一个接受一个 QString 类型参数
# 因为使用字符串来指定 QString 参数的类型,因此该代码在 Python2 和 Python3 中都能运行
valueChanged = Signal([int], ['QString'])

Slot

Slot 的用法与 Signal 类似,区别在于,Slot 只能作为函数装饰器使用,并且不支持传入序列来重载的方式。想要使一个槽能接受多种类型的参数,只能使用多重装饰的方法:

from PyQt5.QtCore import QObject, Slot

class Foo(QObject):

@Slot(int)
@Slot('QString')
def valueChanged(self, value):
...

详见 PyQt5 的文档