【问题标题】:Do I still have to disconnect a lambda from a signal in Qt5.5?我还需要从 Qt5.5 中的信号断开 lambda 吗?
【发布时间】:2016-01-26 05:46:39
【问题描述】:

在早期的 Qt 5 版本中,我必须断开 lambda 与信号的连接,如下所示:“Disconnecting lambda functions in Qt5”。

Here我找到了以下语句: 'receiver' 被销毁时不会自动断开连接,因为它是一个没有 QObject 的函子。但是,从 5.2 开始,有一个重载会添加一个“上下文对象”。当该对象被销毁时,连接被破坏(上下文也用于线程亲和性:将在用作上下文的对象的事件循环的线程中调用 lambda。

  • 这是否意味着我不再需要断开 lambda 与 Qt5.2 或更高版本的连接?
  • 我必须传递该上下文还是自动完成?

【问题讨论】:

    标签: c++ qt lambda qt5.5


    【解决方案1】:

    当对象通过QObject::~QObject() 销毁时,Qt 会自动删除与对象的所有连接。所以如果你创建一个到 lambda 的连接,当发送对象被删除时,连接会被自动清理。您没有,以前也不需要自己断开连接。

    当您需要对连接的生命周期进行更细粒度的控制时,将使用您所指的上下文对象。当您希望在销毁另一个对象(上下文对象)时删除连接时使用此选项。如果您需要在发送者被销毁之前删除连接,这将更容易删除。

    总而言之:您不需要手动断开 lambda,它们会自动清理。您可以使用上下文对象在发送者对象被销毁之前移除连接。

    【讨论】:

    • 上下文对象需要是一个QObject,不是吗?它不适用于普通的 C++ 对象,只是为了再次确认。
    • 是的,上下文对象必须是QObject。
    • 问题通常是,当接收对象被提前销毁时。然后 lambda(可能)尝试调用已经销毁的接收器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 2021-10-24
    • 2012-08-25
    相关资源
    最近更新 更多