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

lar*_*moa 24 c++ qt signals-slots qt-signals

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

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

  • 使用信号报告错误是否可以?
  • 可以假设信号将被处理吗?
  • 信号可用于启动行动吗?例如,signal displayInfoScreen()必须由显示信息屏幕的插槽处理.

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

Căt*_*tiș 13

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

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


e8j*_*han 13

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

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

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

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

信号可用于启动行动吗?例如,信号displayInfoScreen()必须由显示信息屏幕的插槽处理.

再次,是的,例如QAction对象.但是,如果您希望能够重用组件,则必须小心确保实际的类不依赖于它.


ere*_*der 11

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

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


Cal*_*itt 6

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

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

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

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

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

信号可用于启动行动吗?例如,信号displayInfoScreen()必须由显示信息屏幕的插槽处理.

信号可用于启动操作,但可能与您的思维方式不同.信号表明foo已经发生.如果监视您的类的代码决定在foo发生时,应显示一个对话框,然后使用该信号启动该操作.但是,发出信号的类通常不负责确保发生正确的动作,因为它不负责执行该动作.(如果是,那么它应该是同一类的一部分,并且不需要信号.)