我应该使用Qt信号/插槽机制而不是传统的回调吗?

时间:2010-06-09 15:26:00

标签: c++ qt callback

我团队的高级开发人员在我们的Qt应用程序中使用了传统的C-style callbacks,而不是使用Qt信号/插槽机制。

我的第一反应是替换他的代码并改用Qt信号/插槽。

在Qt应用程序/库中使用回调是否有充分的理由?

感谢。

2 个答案:

答案 0 :(得分:18)

我认为更好的方法是接受你正在使用的框架并使用信号/插槽。

话虽如此,如果有问题的代码有效,并且不丑或造成问题,那么你最好不要管它。

咨询Signal/Slot documentation描述了信号/插槽方法更好的原因:

  

回调有两个基本缺陷:   首先,它们不是类型安全的。我们   永远不能确定   处理函数会调用   使用正确的参数回调。   其次,回调强烈   耦合到处理功能   因为处理功能必须   知道要回拨哪个回叫。

请注意以下事项:

  

与回调相比,信号和插槽稍微慢一点,因为它们提供了更高的灵活性

在大多数情况下,速度可能并不重要,但可能存在一些重复呼叫的极端情况会产生影响。

答案 1 :(得分:2)

您应该区分同步的回调并用于返回渐变结果或元组(多个项目,如对<>但更多)和回调是异步松散耦合。信号/插槽通常应该用于后者。对于前者,它可以有意义,取决于它是否是您的应用程序的主要功能(使用信号/插槽)或非GUI库的可以更便携的接口(使用普通C / C ++的直接回调便携式代码)。

通常,我有简洁的编程设计规则,往往指向最干净,代码/接口复杂度最低的任何东西。对于元组返回的情况,我经常使用QMap而不是创建另一个类定义或信号/槽或回调方法。这对于捆绑和传递参数也很有效,特别是对于需要在系统的不同部分进化的东西。