本文主要是介绍pyside6的信号与槽的简单测试,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
from PySide6.QtCore import QObject, Signal, QCoreApplication
import sysdef handle_signal(arg1, arg2):print("Received objects:", arg1, arg2)class UI(QObject): # 创建QObject,用来承载和定义信号signal1 = Signal(object, object) # 定义信号,为了提高灵活性,并没有定义信号的具体数据类型,而是定义为了objectdef __init__(self):super().__init__()self.signal1.emit('a', 100.0) # 发射信号if __name__ == "__main__":app = QCoreApplication(sys.argv)ui = UI()ui.signal1.connect(handle_signal) # 信号的连接sys.exit(app.exec())
运行结果,并没有正确执行。尽管这个信号被发射了,但在此时还没有槽连接到这个信号,因此没有任何效果。
修改,将槽的连接定义移至发射前面:原则上,先定义槽连接,再发射信号。
from PySide6.QtCore import QObject, Signal, QCoreApplication
import sysdef handle_signal(arg1, arg2):print("Received objects:", arg1, arg2)class UI(QObject): # 创建QObject,用来承载和定义信号signal1 = Signal(object, object) # 定义信号,为了提高灵活性,并没有定义信号的具体数据类型,而是定义为了objectdef __init__(self):super().__init__()if __name__ == "__main__":app = QCoreApplication(sys.argv)ui = UI()ui.signal1.connect(handle_signal) # 信号的连接ui.signal1.emit('a', 100.0) # 发射信号sys.exit(app.exec())# 运行结果:Received objects: a 100.0
进一步的,发射和接收参数的数量:
信号定义了2个参数,只发射了1个,出错。
from PySide6.QtCore import QObject, Signal, QCoreApplication
import sysdef handle_signal(arg1, arg2):print("Received objects:", arg1, arg2)class UI(QObject): # 创建QObject,用来承载和定义信号signal1 = Signal(object, object) # 定义信号,为了提高灵活性,并没有定义信号的具体数据类型,而是定义为了objectdef __init__(self):super().__init__()if __name__ == "__main__":app = QCoreApplication(sys.argv)ui = UI()ui.signal1.connect(handle_signal) # 信号的连接ui.signal1.emit('a') # 发射信号sys.exit(app.exec())
# 出错信息:
TypeError: signal1(PyObject,PyObject) needs 2 argument(s), 1 given!
信号定义了3个参数,发射了3个,只接收2个,可以的。
from PySide6.QtCore import QObject, Signal, QCoreApplication
import sysdef handle_signal(arg1, arg2):print("Received objects:", arg1, arg2)class UI(QObject): # 创建QObject,用来承载和定义信号signal1 = Signal(object, object, object) # 定义信号,为了提高灵活性,并没有定义信号的具体数据类型,而是定义为了objectdef __init__(self):super().__init__()if __name__ == "__main__":app = QCoreApplication(sys.argv)ui = UI()ui.signal1.connect(handle_signal) # 信号的连接ui.signal1.emit('a', 100.0, 123) # 发射信号sys.exit(app.exec())# 运行结果:Received objects: a 100.0
总结:发射的参数必须按照信号的定义数量,槽函数接收的参数数量可以比定义的数量少。
可能的应用场景:PLC通信,上位机接收到PLC发送的数据包之后,第一个数据单元可能规定了数据的参数,第二个数据单元可能是数据的具体内容。
demo:
from PySide6.QtCore import QObject, Signal, QCoreApplication
import sysdef analysis_signal(arg1, arg2): # 解析PLC数据print("Received datas:", arg1, "\nLength of datas:", arg2)def datas_signal(*args): # 拆包数据print("Datas is:", *args[2:])class UI(QObject): # 创建QObject,用来承载和定义信号signal1 = Signal(object, object, object) # 定义信号,为了提高灵活性,并没有定义信号的具体数据类型,而是定义为了objectdef __init__(self):super().__init__()if __name__ == "__main__":app = QCoreApplication(sys.argv)ui = UI()ui.signal1.connect(analysis_signal) # 信号的连接ui.signal1.connect(datas_signal)datas = ('a1', 5, (0xfe, 100, 200, 200.0, 123)) # 数据包demo,a1的含义:来自PLC1的数据;5:数据长度;(0xfe, 100, 200, 200.0, 123):数据包具体内容。ui.signal1.emit(*datas) # 发射信号sys.exit(app.exec())# 运行结果:
Received datas: a1
Length of datas: 5
Datas is: (254, 100, 200, 200.0, 123)
这篇关于pyside6的信号与槽的简单测试的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!