【问题标题】:Qt - Clear old signalsQt - 清除旧信号
【发布时间】:2011-07-19 09:49:01
【问题描述】:

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

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

提前致谢!

【问题讨论】:

  • 听起来像是代码中的错误,这不应该发生。请注意,默认情况下,信号是同步的
  • 如何关闭表格 A?与hide()?

标签: qt signals slot


【解决方案1】:

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

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

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

【讨论】:

  • 我尝试使用 Qt::UniqueConnection,但是当我调试时,仍然再次创建连接。我通过在表单 A 关闭时调用 disconnect 解决了这个问题
  • 我认为当通过单击对话框上的 X 按钮关闭表单 A 时,表单 A 并没有真正被破坏,因为我认识到没有调用表单 A 的析构函数是连接仍然存在的原因。
  • 按下 X/ok/cancel/etc 按钮不会破坏对话框,这是有充分理由的。如果它被破坏,那么一旦对话框关闭,您将无法访问任何用户输入的数据。这对于模态对话框来说可能是非常有问题的。此外,如果您在堆栈上创建对话框,它将如何自毁?
【解决方案2】:

您应该发布您打开/重新打开和关闭表单 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多