您需要通过几个pyqtSlot设置所有信号的签名:
from PyQt5.QtCore import pyqtSignal, pyqtSlot, QCoreApplication, QObject, QTimer
class MyClass(QObject):
signal_1 = pyqtSignal(str, int)
signal_2 = pyqtSignal(int, int)
signal_3 = pyqtSignal(str, int, int)
class OtherClass(QObject):
@pyqtSlot(str, int)
@pyqtSlot(int, int)
@pyqtSlot(str, int, int)
def unifiedResponse(self, *args):
print(args)
def main():
import sys
app = QCoreApplication(sys.argv)
sender = MyClass()
receiver = OtherClass()
sender.signal_1.connect(receiver.unifiedResponse)
sender.signal_2.connect(receiver.unifiedResponse)
sender.signal_3.connect(receiver.unifiedResponse)
def on_timeout():
sender.signal_1.emit("StackOverflow", 1)
sender.signal_2.emit(1, 2)
sender.signal_3.emit("StackOverflow", 1, 2)
QTimer.singleShot(1000, QCoreApplication.quit)
QTimer.singleShot(1000, on_timeout)
sys.exit(app.exec_())
if __name__ == "__main__":
main()
如果您想发送多种类型的数据,一般最好使用更通用的数据类型,如列表(或对象):
class MyClass(QObject):
signal_1 = pyqtSignal(list)
signal_2 = pyqtSignal(list)
signal_3 = pyqtSignal(list)
class OtherClass(QObject):
@pyqtSlot(list)
def unifiedResponse(self, args):
print(args)
def main():
import sys
app = QCoreApplication(sys.argv)
sender = MyClass()
receiver = OtherClass()
sender.signal_1.connect(receiver.unifiedResponse)
sender.signal_2.connect(receiver.unifiedResponse)
sender.signal_3.connect(receiver.unifiedResponse)
def on_timeout():
sender.signal_1.emit(["StackOverflow", 1])
sender.signal_2.emit([1, 2])
sender.signal_3.emit(["StackOverflow", 1, 2])
QTimer.singleShot(1000, QCoreApplication.quit)
QTimer.singleShot(1000, on_timeout)
sys.exit(app.exec_())
更新:
没有一种优雅的方法可以访问最后一个元素,但可以访问前面的元素,因为插槽签名必须是信号签名的子集。例如,具有“int”签名的插槽可以接受带有从第一个类型到“int”的签名的信号,其他参数将被丢弃:
from PyQt5.QtCore import pyqtSignal, pyqtSlot, QCoreApplication, QObject, QTimer
class MyClass(QObject):
signal_1 = pyqtSignal(int, str)
signal_2 = pyqtSignal(int, int)
signal_3 = pyqtSignal(int, str, int)
class OtherClass(QObject):
@pyqtSlot(int)
def unifiedResponse(self, index):
print(index)
def main():
import sys
app = QCoreApplication(sys.argv)
sender = MyClass()
receiver = OtherClass()
sender.signal_1.connect(receiver.unifiedResponse)
sender.signal_2.connect(receiver.unifiedResponse)
sender.signal_3.connect(receiver.unifiedResponse)
def on_timeout():
sender.signal_1.emit(1, "StackOverflow")
sender.signal_2.emit(2, 2)
sender.signal_3.emit(3, "StackOverflow", 1)
QTimer.singleShot(1000, QCoreApplication.quit)
QTimer.singleShot(1000, on_timeout)
sys.exit(app.exec_())
if __name__ == "__main__":
main()