假设我有表单 A 可以处理表单 B 发出的信号 x。当信号 x 发出时,表单 A 会做一些事情。然后我关闭表格 A,重新打开表格 A 并等待信号 x。但是,处理信号 x 的时隙被调用了两次。我重复关闭和重新打开表格 A。处理信号 x 的槽称为递增数。
即使收到旧信号,它似乎仍然存在。有什么方法可以清除旧信号吗?
预先感谢!
当插槽接收到信号时,信号/插槽连接不会消失。没有“发射一次”的概念。因此,您似乎多次连接相同的信号/插槽。请注意,如果您要破坏表单 A,其所有连接将自动断开。因此,在 connect 语句附近放置一个断点并测试发生了什么。或者,您可以只使用唯一的连接:
" Qt::UniqueConnection 与 AutoConnection 相同,但只有在不复制现有连接时才会建立连接。即,如果同一信号已连接到同一对对象的同一插槽,则连接将失败。这种连接类型是在 Qt 4.6 中引入的。”
只需添加 Qt::UniqueConnection 作为您连接调用的最后一个参数。
您应该发布您打开/重新打开和关闭表单 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