Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 何时使用信号和插槽,何时不使用_C++_Qt_Signals Slots_Qt Signals - Fatal编程技术网

C++ 何时使用信号和插槽,何时不使用

C++ 何时使用信号和插槽,何时不使用,c++,qt,signals-slots,qt-signals,C++,Qt,Signals Slots,Qt Signals,我们使用的Qt提供信号和插槽,我觉得非常方便。然而,强大的力量带来巨大的责任,我认为滥用这个功能也很容易 是否有信号插槽使用的最佳实践?我很难找到这种方式的一般指导方针。一些问题(我有明确的意见,但并非我团队的所有成员都同意): 使用信号报告错误可以吗 假设将处理一个信号可以吗 可以使用信号启动操作吗?例如,信号显示信息屏幕()必须由显示信息屏幕的插槽处理 关于何时应该/不应该使用信号的任何其他意见都是非常受欢迎的 假设将处理一个信号可以吗 不,不是。信号是火和遗忘类型的东西。发射器不应该关

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

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

  • 使用信号报告错误可以吗
  • 假设将处理一个信号可以吗
  • 可以使用信号启动操作吗?例如,
    信号显示信息屏幕()
    必须由显示信息屏幕的插槽处理
关于何时应该/不应该使用信号的任何其他意见都是非常受欢迎的

假设将处理一个信号可以吗

不,不是。信号是火和遗忘类型的东西。发射器不应该关心谁连接到信号以及信号做什么。

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

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


事件的问题是当您根据客户机需求设计事件时。例如,您不应该有一个信号
displayInfoScreen
,因为它假定了使用该信号的对象的某些信息。相反,它应该是
infoChanged
,而
InfoScreenDisplayer
会监听此信号以将其显示在屏幕上。如果需要,您可以稍后添加一个
InfoTweeterPoster
,每当信息发生变化时,它都会在Tweeter上发布信息。

信号和插槽功能强大,因为它们可以解耦对象。您不能像前面回答的那样,假设信号已连接插槽

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

使用信号报告错误可以吗

是的,但我通常会根据情况来决定。如果错误可能是异步发生的,那么一个指示这种错误的信号肯定是正确的。如果错误只发生在客户端代码调用某个函数时,那么错误应该出现在该函数的响应中,而不是作为信号。然而,在这两者之间有一系列的情况,可以根据具体情况进行处理

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

假设将处理一个信号可以吗

信号(哲学上)被设计用来表明发生了什么事。正如其他人所指出的,假设一个信号将与一个插槽匹配,甚至与另一个插槽匹配,这从来都不是一个好主意

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

信号可以用来启动行动,但可能不是以你的思维方式。该信号表明发生了foo。如果监视类的代码决定当发生foo时,应该显示一个对话框,那么该信号用于启动该操作。但是,发出信号的类通常不负责确保正确的操作发生,因为它不负责执行该操作。(如果是,那么它应该是同一类的一部分,不需要信号。)

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

是的,例如,参见QFtp,其中done信号携带状态。它不携带实际错误,只携带发生错误的信息

假设一个信号会发出,可以吗 被处理

不可以。但是,发件人永远不能认为您的特定应用程序可以依赖它。例如,需要处理表示File-New的QAction以使应用程序正常工作,但QAction对象对此毫不关心

可以用信号来启动吗 行动?例如信号 displayInfoScreen()必须由 显示信息屏幕的插槽


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

您编写了一个又称事件,但事实并非如此。Qt附带了一个独立的事件基础设施。这个答案提供了在Qt中使用的简单示例。您认为错误是可以的,但只有在处理是异步的情况下才可以吗?谢谢!是的,否则,添加状态返回值或状态参数(就像QString::toInt那样)。