在 Qt5 中断开 lambda 函数

新手上路,请多包涵

是否可以断开 lambda 函数?如果“是”,怎么做?

根据 https://qt-project.org/wiki/New_Signal_Slot_Syntax 我需要使用从 QObject::connect 方法返回的 QMetaObject::Connection ,但是我怎样才能将该对象传递给 lambda 函数?

伪代码示例:

 QMetaObject::Connection conn = QObject::connect(m_sock, &QLocalSocket::readyRead, [this](){
    QObject::disconnect(conn); //<---- Won't work because conn isn't captured

    //do some stuff with sock, like sock->readAll();
}

原文由 alexandernst 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 652
1 个回答

如果您直接捕获 conn ,您将通过复制捕获未初始化的对象,这会导致未定义的行为。您需要捕获一个智能指针:

 std::unique_ptr<QMetaObject::Connection> pconn{new QMetaObject::Connection};
QMetaObject::Connection &conn = *pconn;
conn = QObject::connect(m_sock, &QLocalSocket::readyRead, [this, pconn, &conn](){
    QObject::disconnect(conn);
    // ...
}

或者使用共享指针,开销稍大:

 auto conn = std::make_shared<QMetaObject::Connection>();
*conn = QObject::connect(m_sock, &QLocalSocket::readyRead, [this, conn](){
    QObject::disconnect(*conn);
    // ...
}

从 Qt 5.2 你可以改为使用上下文对象:

 std::unique_ptr<QObject> context{new QObject};
QObject* pcontext = context.get();
QObject::connect(m_sock, &QLocalSocket::readyRead, pcontext,
    [this, context = std::move(context)]() mutable {
    context.reset();
        // ...
 });

原文由 ecatmur 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题