【问题标题】:Qt Slots and Signals confusionQt 插槽和信号混淆
【发布时间】:2015-07-18 04:26:19
【问题描述】:

我现在正在使用 Qt;我对他们对插槽和信号的实现感到有些困惑(使用 5.4,但也可以使用旧语法)。我已经到处寻找这部分的一个很好的解释,但它让我望而却步。

我曾经在其他(非 Qt)项目中创建插槽和信号机制。我有一个消息管理器,以及一个向它注册的例程,它想发送一个信号。它会将其发送给消息管理器。同样,接收器将向它注册它希望收到信号通知。它会询问消息管理器。然后,当信号发生时,它会将其路由到侦听器。发送者不知道它有多少(如果有)监听器,监听器也不知道谁可以发送该信号(如果有的话)。

我认为 Qt 是这样工作的,我仍然可以通过编写自己的消息管理器来伪造它,但似乎插槽和信号应该处理它。但是,在所有插槽和信号示例的阅读中,似乎在建立连接时,您需要知道信号的发送者是谁,然后将其连接到您的插槽。但是,如果信号来自多个地方怎么办?您是否必须将其连接到每个模块?这似乎违背了目的,但我发现的每个例子都表明它知道信号来自哪里。

感谢任何澄清。

【问题讨论】:

  • 你说的信号来自多个地方是什么意思?您能否添加一些(伪)代码来说明您要实现的目标?
  • 我的意思是多个来源可以发送相同的信号。例如,可能有一个信号说“revertAll”(示例)。多个函数可能会遇到必须发出 revertAll 的情况。他们进行了更改,但其他人可能想要更改,因此它会发出“revertAll”消息,而不关心谁得到它。同样,模块可能需要知道我们何时恢复,因此它可以自行调整。 revertAll 可能会在多种情况下发生,因此不清楚谁可以发送它(并且给定的模块不应该提前知道其他模块)。就像 Windows 消息传递一样。
  • 其实另一个例子是在 Android/Java 中你如何设置监听器。任何人都可以收听事件。该界面中的任何其他人都可以发出事件。您不必知道它的去向或来源即可使用它。
  • 实际上,如果你有一些全局“revertAll”信号,你也应该有一些全局对象负责发送这个信号。例如,您可以创建一个单例类Manager,使用其唯一实例发送Manager::revertAll 信号,并在每个连接中使用相同的实例。这实际上与您描述的相同。但是,信号和事件通常不是全局的,而是绑定到某些对象。每个特定的信号总是有一些东西负责,或者它可以放在主窗口类中作为最后的手段。
  • 这就是我要做的事情——编写一个调度程序。我不介意,我以前做过,但我希望(从描述的方式来看)插槽和信号会为我做这件事。我想我只会制作一个调度对象,各种模块可以只听那个对象,而不需要知道其他的。谢谢。

标签: qt signals signals-slots slots


【解决方案1】:

这可能会有所启发。取自http://doc.qt.io/qt-5/signalsandslots.html

槽是普通的 C++ 函数 ...

【讨论】:

  • 很抱歉,这对上面提出的问题没有任何帮助。
  • 不幸的是,该示例仍然在两端使用已知的反对意见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-15
  • 2013-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多