簡體   English   中英

在 Qt5 中斷開 lambda 函數

[英]Disconnecting lambda functions in Qt5

是否可以斷開 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();
}

如果您直接捕獲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.release();
        // ...
 });

ecatmur 答案中的上下文解決方案是最簡單的選擇,但我認為智能指針的使用使其難以理解。 我更喜歡使用原始指針:

QObject *context = new QObject(this);
connect(sender, &Sender::signal, context, [context] {
  delete context;
  // ...
});

您可以將conn定義為 .h 文件中的私有變量。 QMetaObject::Connection conn
在 lambda 函數中,您可以使用conn並斷開它。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM