Qt - 清除旧信号

时间:2011-07-19 09:49:02

标签: qt signals slot

假设我有表格A可以处理表格B发出的信号x。 当发出信号x时,形式A会起作用。然后我关闭表格A,重新打开表格A并等待信号x。但是,处理信号x的槽被调用两次。 我重复关闭并重新打开表格A.用于处理信号x的槽称为递增数字。

即使收到了,似乎旧的信号仍然存在。 有没有办法清除旧信号?

提前感谢!

2 个答案:

答案 0 :(得分:4)

当插槽接收到信号时,信号/插槽连接不会消失。没有“一次发射”的概念。因此,您似乎多次连接相同的信号/插槽。请注意,如果您要破坏表单A,其所有连接将自动断开连接。所以在connect语句附近设置一个断点并测试发生了什么。或者,您可以使用唯一的连接:

Qt::UniqueConnection与AutoConnection相同,但只有当它不复制现有连接时才进行连接。即,如果相同的信号已经连接到同一对对象的同一个插槽,那么连接将失败。此连接类型在Qt 4.6中引入。“

只需添加Qt :: UniqueConnection作为连接呼叫的最终参数。

答案 1 :(得分:1)

您应该将代码的一部分发布到您打开/重新打开的位置并关闭表单A.

根据您的描述,当您重新打开表单时,您似乎正在创建一个新的(不同的表单对象)并一遍又一遍地连接相同的信号。

您应该只创建一次form A - 当您第一次需要时 - 但在程序执行期间继续使用。重新打开时,您应该只执行formA->show()

这样的东西
void showFormA() {

    if (myFormA == 0 ) {

        myFormA = new FormA(this);
        //connect signals/slots
        //...
    }

    myFormA->show();
}

编辑:

关于您的问题以及您是否可以“清除”旧信号。 见http://doc.qt.io/qt-5/qobject.html#disconnect