何时使用信号和插槽以及何时不使用

时间:2010-02-24 10:18:26

标签: c++ qt signals-slots qt-signals

我们正在使用提供信号和插槽的Qt,我发现非常方便。然而,强大的力量带来了巨大的责任,我认为很容易滥用这个功能。

是否有信号槽使用的最佳做法?我很难以这种方式找到一些通用指南。一些问题(我有明确的意见,但并非所有团队成员都同意):

  • 使用信号报告错误是否可以?
  • 可以假设信号会被处理吗?
  • 可以使用信号来启动操作吗?例如。 signal displayInfoScreen()必须由显示信息屏幕的插槽处理。

关于何时应该/不应该使用信号的任何其他意见非常欢迎!

5 个答案:

答案 0 :(得分:12)

信号和插槽功能强大,因为它会分离对象。您不能假设信号已连接插槽,如前所述。

基于信号/插槽的设计的一个主要缺点是,您可以非常轻松地跟踪您实现的逻辑,因为对象的一个​​动作可以触发连接到的任何其他对象的其他动作发出的信号。更容易产生不必要的副作用,递归调用等。

答案 1 :(得分:12)

  

使用信号报告是否可以   错误?

是的,例如,请参阅QFtp,其中完成信号带有状态。它不包含实际错误,只包含发生错误的信息。

  

可以假设信号会   处理?

没有。发件人永远不会假设您的特定应用程序可以依赖它。例如,需要处理代表File-New的QAction以使应用程序正常工作,但QAction对象可能并不在乎。

  

可以使用信号启动   行动?例如。信号   displayInfoScreen()必须由。处理   一个显示信息屏幕的插槽。

再次,是的,例如QAction对象。但是如果你想重用组件,你必须小心确保实际的类不依赖它。

答案 2 :(得分:10)

  

可以假设信号会被处理吗?

不,不是。信号是一种即发即弃的东西。谁连接到信号及其作用不应该是发射器的关注点。

答案 3 :(得分:5)

  

使用信号报告错误是否可以?

是的,但我通常会依赖这种情况。如果错误可能异步发生,那么表明这种情况的信号肯定是正确的。如果错误仅在客户端代码调用某个特定函数时发生,则错误应该在该函数的响应中,而不是作为信号。但是,两者之间可能存在各种各样的情况。

此外,信号槽机制可以使跨线程通信更容易(这可能被认为是异步情况),我会将它们用于此目的(错误或否)。

  

可以假设信号会被处理吗?

信号(哲学上)旨在表明发生了某些事情。正如其他人所指出的那样,假设一个信号与一个插槽匹配,或者甚至只用一个其他插槽,这绝不是一个好主意。

  

可以使用信号来启动操作吗?例如。信号displayInfoScreen()必须由显示信息屏幕的插槽处理。

信号可用于启动操作,但可能不符合您的想法。信号表明发生了 foo 。如果监控您的类的代码决定何时发生 foo ,则应显示一个对话框,然后使用该信号启动该操作。但是,发出信号的类通常不负责确保发生正确的动作,因为它不负责执行该动作。 (如果是,那么它应该是同一类的一部分,并且不需要信号。)

答案 4 :(得分:3)

信号/插槽(也称为事件)是删除对象之间耦合的好方法。

例如,不是拥有了解模型如何工作的视图,而是在模型发生变化时,他们“倾听”模型。该模型负责说明它何时发生变化,发生了什么变化。

事件的问题在于您根据客户要求设计事件。例如,您不应该有一个信号displayInfoScreen,因为它假定使用此信号的对象。相反,它应该是infoChanged并且InfoScreenDisplayer会侦听此信号以在屏幕上显示它。如果需要,您可以稍后添加InfoTweeterPoster,以便在Tweeter更改时发布信息。