PySide6 信号槽机制 使用技巧 常见问题 注意事项


一般情况下,可直接调用函数或对象。

若在某个类实例中,无法修改其它类实例某些参数或调用某些函数,可采用信号槽机制。

若需高频调用某一函数或对象,但又不能确定先前的调用已处理完成,这时可采用信号槽机制。

将信号槽机制结合 QThread,是很常见的使用手段。

注意:不要同时把多个不同信号输出给同一槽函数,这可能出现类似死循环的现象,导致应用程序过于繁忙或崩溃。

基本句法


在 PySide1.2 PySide2.x PyQt4 中,使用 QComboBox.currentTextChanged 信号有时会无响应,如下所示:

self.connect(self.boxCombo, SIGNAL("currentTextChanged()"), self.testText)
 
self.connect(self.boxCombo, SIGNAL("currentTextChanged(str)"), self.testText)
					

其中 str 是要传递的自变量,不给定则不传递。虽然这种问题很少出现,但由于 QComboBox 比较常用,还是能经常遇到。

注意:在 PyQt5 中,所有信号连接均统一使用以下语法,不再支持以上语法;当然,PySide1.2 PySide2.x 也支持以下语法。

self.boxCombo.currentTextChanged.connect(self.testText)
					

发送器


self.sender() 通常用于在槽函数 (或方法) 侧获取信号的发送者,但使用不当会导致无任何提示的直接崩溃。

不在槽中调用这的崩溃虽然很少见 (并不总是这样),但因没有任何提示很容易被忽略。

异常提示


以下语句若出现异常,PySide2 会引 RuntimeError 而 PyQt5 会引 TypeError:

self.itemChanged.disconnect(self.itemTest)
					

当采用硬连接函数调用时,若出现

RecursionError: maximum recursion depth exceeded
						
死循环错误提示,可以考虑使用信号/槽软连接机制。

Note:

这种死循环错误提示一般不会弹出错源文件及具体行号,非常难于判断。

有时,运行时间短的代码不提示死循环,而运行时间长的代码却会提示这是死循环。

槽装饰器


通常,不必在槽函数定义上方添加声明,即槽函数的定义同普通函数 (或方法) 没有区别。

但有要求的特殊情况除外。

Copyright Notice: This article is exclusive original manuscripts, copyrighted by Happy Digits Software , shall not be reproduced without permission.