是否可以断开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();
}
4条答案
按热度按时间q9rjltbz1#
如果你直接捕获
conn
,你是通过复制捕获一个未初始化的对象,这会导致未定义的行为。您需要捕获一个智能指针:或者使用共享指针,开销稍大:
从Qt 5.2开始,你可以使用一个context对象:
50pmv0ei2#
ecatmur的答案中的上下文解决方案是最简单的选择,但我认为智能指针的使用使其难以理解。我更喜欢使用原始指针:
yquaqz183#
Qt 6增加了
Qt::SingleShotConnection
连接类型。如果意图是在第一次呼叫后无条件地断开连接(而不是基于其他条件断开连接),那么这将起作用:9lowa7mx4#
您可以在.h文件中将
conn
定义为私有变量。QMetaObject::Connection conn
。在lambda函数中,可以使用
conn
并断开连接。