4

假设我有表单 A 可以处理表单 B 发出的信号 x。当信号 x 发出时,表单 A 会做一些事情。然后我关闭表格 A,重新打开表格 A 并等待信号 x。但是,处理信号 x 的时隙被调用了两次。我重复关闭和重新打开表格 A。处理信号 x 的槽称为递增数。

即使收到旧信号,它似乎仍然存在。有什么方法可以清除旧信号吗?

预先感谢!

4

2 回答 2

4

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

" Qt::UniqueConnection 与 AutoConnection 相同,但只有在不复制现有连接时才会建立连接。即,如果同一信号已连接到同一对对象的同一插槽,则连接将失败。这种连接类型是在 Qt 4.6 中引入的。”

只需添加 Qt::UniqueConnection 作为您连接调用的最后一个参数。

于 2011-07-19T10:03:03.310 回答
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

于 2011-07-19T10:51:00.813 回答