在 PyQt 中,可以使用pyqtSignal来创建自定义信号。自定义信号可以让一个对象在某个事件发生时发出信号,而其他对象可以连接这个信号,并在接收到信号时执行相应的操作。如果要实现自定义信号传递多种参数,需要使用 pyqtSignal 的 overload 功能。
下面是一个演示如何定义一个带有多个参数的自定义信号,并在两个对象之间进行信号传递的例子:
from PyQt5.QtCore import pyqtSignal, QObject, Qt
class MyObject(QObject):
# 定义多个重载版本的自定义信号
my_signal = pyqtSignal()
my_signal_int = pyqtSignal(int)
my_signal_str = pyqtSignal(str)
my_signal_int_str = pyqtSignal(int, str)
def do_something(self):
# 发射不带参数的自定义信号
self.my_signal.emit()
# 发射带一个 int 类型参数的自定义信号
self.my_signal_int.emit(42)
# 发射带一个 str 类型参数的自定义信号
self.my_signal_str.emit("hello")
# 发射带一个 int 类型参数和一个 str 类型参数的自定义信号
self.my_signal_int_str.emit(42, "world")
class MyReceiver(QObject):
def handle_my_signal(self):
# 接收到不带参数的自定义信号时执行的操作
print('Received signal without arguments')
def handle_my_signal_int(self, value):
# 接收到带一个 int 类型参数的自定义信号时执行的操作
print('Received signal with int argument:', value)
def handle_my_signal_str(self, value):
# 接收到带一个 str 类型参数的自定义信号时执行的操作
print('Received signal with str argument:', value)
def handle_my_signal_int_str(self, value1, value2):
# 接收到带一个 int 类型参数和一个 str 类型参数的自定义信号时执行的操作
print('Received signal with int and str arguments:', value1, value2)
if __name__ == '__main__':
# 创建对象
obj = MyObject()
receiver = MyReceiver()
# 将 MyObject 对象的 my_signal 信号连接到 MyReceiver 对象的 handle_my_signal 槽函数上
obj.my_signal.connect(receiver.handle_my_signal)
# 将 MyObject 对象的 my_signal_int 信号连接到 MyReceiver 对象的 handle_my_signal_int 槽函数上
obj.my_signal_int.connect(receiver.handle_my_signal_int)
# 将 MyObject 对象的 my_signal_str 信号连接到 MyReceiver 对象的 handle_my_signal_str 槽函数上
obj.my_signal_str.connect(receiver.handle_my_signal_str)
# 将 MyObject 对象的 my_signal_int_str 信号连接到 MyReceiver 对象的 handle_my_signal_int_str 槽函数上
obj.my_signal_int_str.connect(receiver.handle_my_signal_int_str)
# 发射信号
obj.do_something()
在这个例子中,我们定义了一个名为 MyObject 的类,其中定义了一个自定义信号 my_signal。在 do_something 函数中,我们发射了这个自定义信号。我们还定义了一个名为 MyReceiver 的类,在这个类中定义了一个槽函数 handle_my_signal,该槽函数在接收到 my_signal 信号时会被调用。在主程序中,我们创建了一个 MyObject 对象和一个 MyReceiver 对象,并将 my_signal 信号连接到 handle_my_signal 槽函数上。最后,我们调用 do_something 函数,发射 my_signal 信号。
当 my_signal 信号被发射时,handle_my_signal 槽函数会被调用,并输出一条消息。这就完成了两个对象之间的信号传递。