Qt - 清除旧信号

3

假设我有一个表单A,可以处理由表单B发出的信号x。 当信号x被发出时,表单A会执行某些操作。然后我关闭表单A,重新打开表单A并等待信号x。但是,处理信号x的插槽被调用了两次。 我重复关闭和重新打开表单A。处理信号x的插槽被调用的次数越来越多。

似乎旧信号仍然存在,即使它已经被接收到。 是否有任何方法可以清除旧信号?


代码中似乎有一个错误,这不应该发生。请注意,默认情况下信号是同步的。 - Mat
你怎么关闭A表单?用 hide() 吗? - Exa
2个回答

4
信号/槽连接在槽函数接收到信号后不会消失。没有“仅发射一次”的概念。因此,看起来您正在多次连接相同的信号/槽。请注意,如果您销毁了 A 窗体,它的所有连接将自动断开。因此,请在 connect 语句附近设置断点并测试发生了什么。或者,您可以使用唯一连接: "Qt::UniqueConnection与 AutoConnection 相同,但仅当它不重复现有连接时才进行连接。即,如果相同的信号已经连接到相同的槽函数,为相同的对象对,则连接将失败。这种连接类型是在 Qt 4.6 中引入的。" 只需将 Qt::UniqueConnection 添加为 connect 调用的最后一个参数即可。

我尝试使用Qt::UniqueConnection,但是在调试时,连接仍然被创建了。我通过在A表单关闭时调用disconnect来解决这个问题。 - fucai1116
我认为当通过对话框上的X按钮关闭表单A时,表单A并没有真正被销毁,因为我发现表单A的析构函数没有被调用是连接仍然存在的原因。 - fucai1116
1
按下X/确定/取消等按钮不会销毁对话框,这是有充分理由的。如果它被销毁了,那么一旦关闭对话框,您将无法访问任何用户输入的数据。这对于模态对话框可能非常棘手。此外,如果您在堆栈上创建了对话框,它又如何能够自我销毁呢? - Elmar de Koning

1

你应该发布你打开/重新打开和关闭A表单的代码部分。

根据你的描述,当你重新打开表单时,实际上是创建了一个新的(不同的表单对象),并且一次又一次地连接相同的信号。

你应该只在需要的时候创建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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接