【问题标题】:Connect a signal to two slots but execute only one slot at a time in Qt将一个信号连接到两个插槽,但在 Qt 中一次只执行一个插槽
【发布时间】:2016-02-23 08:38:47
【问题描述】:

我有一个信号,我想连接到两个插槽,但一次只执行一个插槽。也就是说我有两个跨不同文件的插槽,我希望首先调用插槽 1。稍后当我再次发出相同的信号时,我希望调用插槽 2,而不是调用插槽 1。

在文件 1 中:

connect(...,SIGNAL(mySignal),...,SLOT(mySlot1()));

在文件 2 中:

connect(...,SIGNAL(mySignal),...,SLOT(mySlot2()));

首先我发出信号,然后我希望 mySlot1() 被单独调用。 下次当我发出相同的信号时,我希望 mySlot2() 单独调用。 很明显,两者都采用相同的论点。我不想为它创建一个新信号(就像已经制作的 mySignal 一样)。这可能吗 ?我能做什么?

【问题讨论】:

  • 看起来信号/插槽不是您想要的。
  • 可以创建一个信号“负载平衡器”对象,该对象具有一个插槽,该插槽接受信号以进行负载平衡,并且每次插槽接收到信号时都会触发一个信号。每次调用负载均衡器的插槽时,它都会自动连接和断开向负载均衡器注册的插槽。我不确定如何实现这一点或是否可能。也许有人可以对此进行扩展。

标签: c++ qt signals-slots slots


【解决方案1】:

您要求的是信号根据其他一些标准选择它执行的插槽。它在 Qt 中不起作用。当您发出信号时,所有连接的插槽都会被触发(您甚至无法控制它们被触发的顺序)。

获得您描述的行为的唯一方法是让 mySLot1 将自己与信号断开连接,然后连接 mySlot2,然后让 mySlot2 做相反的事情,这样它们就会来回进行乒乓球运动。

【讨论】:

    【解决方案2】:

    一个简单的解决方案是在您的信号中添加一个额外的参数,指定哪个插槽应该响应该信号。信号将读取此参数并使用if 语句决定是否应执行其代码作为响应。每个插槽都必须响应它自己的此参数的唯一值。

    例如,mySlot1 仅在参数的实参为 1 时才会响应。 mySlot2 只会在参数的参数是2 时才会响应。

    当您发出信号时,您将必须逐个检查这些值,每次发出信号时选择不同的值,以便不同的插槽响应信号。本质上,您将为每个插槽分配一个地址,并在每次根据其地址引发信号时调用不同的插槽。

    这本身并不是一个非常通用的解决方案。为了概括它,您需要一种方法来为每个插槽分配一个唯一的有效地址,并将这些地址注册到引发信号的对象中。但是,这是我能想到的在不创建更多信号和插槽的情况下解决此问题的唯一方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-07
      • 2020-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多