将一个信号连接到两个插槽,但在 Qt 中一次只执行一个插槽

Connect a signal to two slots but execute only one slot at a time in Qt

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

在文件 1 中:

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

在文件 2 中:

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

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

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

获得您描述的行为的唯一方法是让 mySLot1 断开与信号的连接,然后连接 mySlot2,然后让 mySlot2 执行相反的操作,这样它们就会来回乒乓。

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

例如mySlot1只有参数的argument为1才会响应。 mySlot2 仅当参数的参数为​​ 2.

时才会响应

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

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