Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.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
Design patterns Qt信号和插槽-它们是仅用于GUI还是用于整个应用程序架构?_Design Patterns_Qt - Fatal编程技术网

Design patterns Qt信号和插槽-它们是仅用于GUI还是用于整个应用程序架构?

Design patterns Qt信号和插槽-它们是仅用于GUI还是用于整个应用程序架构?,design-patterns,qt,Design Patterns,Qt,我很好奇-Qt的信号和插槽(委托模式?)是仅用于GUI回调,还是完全可以用于整个应用程序?我的意思是,将应用程序拆分成小的、自包含的对象(类)并通过信号和插槽将它们互连是否更好?如果是这样的话,由于Qt信号的返回值被忽略,那么从信号(类似于用于返回某物的请求信号)返回值的建议方法是什么?您可以将它们用于所有事情 例如,它们在网络代码中工作得非常好。QT的信号和插槽不用于从接收器返回值。它们是一种严格的单向沟通机制 实际上,接收方可能处于一个完全不同的线程中,在发送方emit呼叫返回之后接收来自队

我很好奇-Qt的信号和插槽(委托模式?)是仅用于GUI回调,还是完全可以用于整个应用程序?我的意思是,将应用程序拆分成小的、自包含的对象(类)并通过信号和插槽将它们互连是否更好?如果是这样的话,由于Qt信号的返回值被忽略,那么从信号(类似于用于返回某物的请求信号)返回值的建议方法是什么?

您可以将它们用于所有事情


例如,它们在网络代码中工作得非常好。

QT的信号和插槽不用于从接收器返回值。它们是一种严格的单向沟通机制

实际上,接收方可能处于一个完全不同的线程中,在发送方
emit
呼叫返回之后接收来自队列的信号


至于将其用于除GUI以外的任何其他用途。。你可以在任何适合的地方使用它们,如果适合的话。为什么要把GUI作为特殊的东西来做?< /P> < P>信号和时隙被用来模拟对象在库级之间的消息(因为C++不支持SimalTalk这样的消息),所以你可以在任何你想让对象相互通信的地方使用它们(或者通过一些数据或激活某些东西……)。我几乎在每件事情上都使用了它们,它们工作得很好。我遇到的唯一问题是并发代码,我有多个线程使用信号和插槽相互通信。这真的很糟糕(我需要实时处理消息),因为插槽的执行不是立即的

我不认为可以使用信号返回值(而且不应该),因为信号是用来将数据发送到其他对象的

/*如果你有具体的问题 你想解决这个问题,试着解释一下 也许有办法解决这个问题 */


信号和插槽是实现该功能的一种方式。无论您在何处使用观察者模式(例如减少耦合),都可以使用信号和插槽。

Qt的信号和插槽实现相当灵活。它绝对不限于GUI元素。甚至还有一个单独的排队信号传递机制,允许您将信号从一个线程传递到另一个线程

如果您确实认为需要,您可以在信号内部传递引用或指针,这将允许您将信息传递回发射对象。但我会小心读取信号,以及相应的插槽何时执行。接收器上的信号发射和执行有两种模式,即时模式和排队模式。如果您正在跨线程发送信号,则需要排队,然后立即发出返回


在实践中,我注意到信号和插槽连接的大型网络可能会变得有点难以调试,因为您现在正在创建一个独立于对象派生和包含的结构

具体地说,对于返回值,我没有感觉到Qt的信号和插槽是一种良好的来回机制。正如其他人所提到的,它们在观察者模式/角色中工作得非常好。仔细想想,返回值可能会有问题。。。例如,当有多个插槽连接到一个信号,并且每个插槽返回不同的值时,会发生什么情况?同样的问题也出现在SigC++和Boost::Signals库中,它们都有一个(不同的?)机制来处理它,或者至少弄清楚您将得到什么

如果您真的需要返回值,我发现有两种比较好的方法来管理它。第一种是使用Qt的事件机制来请求数据,然后将请求的数据作为响应传回。请注意,事件没有内置的响应方式,因此需要扩展QEvent才能处理这种情况。事实上,我们在我的工作申请中做了相当多的工作。当您需要异步机制时,它对于线程化应用程序非常有效。此方法的缺点是请求者需要知道其请求数据的对象(以便发送事件)。响应对象只需要知道请求以及如何发回响应,响应通常被编码到请求中。请注意,这几乎与观察者模式相反


第二种方法是将函子对象传递给需要能够请求数据的对象。使用一个好的抽象函子库,可以封装对象和函数,比如前面提到的SigC++或Boost::Signals,这样做会更好。这也适用于需要立即响应的情况——运行functor运算符,并在继续处理函数之前返回一个值。这还允许您编写一个类似于信号/插槽机制的对象,其中需要函数(信号)返回值的对象不需要知道任何有关函子(信号的连接)的位置或来源的信息。它只是在必要时运行函子。

那么一个对象通过信号从另一个对象获取值的推荐方法呢?@地狱之眼:只需将其作为信号参数发送,即将数据从源对象推送到目标对象(我对您的个人体验感兴趣:)。在Qt程序中,非gui类通过信号和插槽相互连接的情况从未如此。通常情况下,它们只需要彼此之间的指针,并使用直接方法调用。可能是因为某些原因吧?传递指针会在类之间产生强耦合,这通常是不可取的。你可以在谷歌上看到很多关于观察家设计模式的文章。@地狱之眼:见马丁·贝克特的回复。除了GUI之外,很多Qt都使用信号和插槽,特别是用于网络,那么它们之间的直接连接呢