如何在C++lambda中访问QObject::sender

How to access QObject::sender in a C++ lambda?

本文关键字:QObject sender 访问 C++lambda      更新时间:2023-10-16

这是一个相当不寻常的问题,但仍然是一个问题。我有一个函数,它接受lambda作为参数,然后将其传递给QObject::connect:

template<typename Functor>
void MyClass::doSomething(Functor f)
{
    connect(network_reply, &QNetworkReply::finished, f);
    //...
}

MyClass::doSomething的示例调用可能如下所示:

doSomething([]()
{
    // how do I get access to the sender???
});

从我的评论中可以看出,没有办法访问QObject::sender来获得指向发出信号的QObject的指针。因为发出信号的类不在创建lambda的范围内,所以无法在lambda内部引用它。

我有什么选择?


编辑:我尝试使用Andy的建议(std::bind),但我最终遇到了一个几乎无法理解的模板错误:

http://paste.ubuntu.com/1614425/

摘录:

decltype无法解析重载函数的地址

并且它指向CCD_ 6呼叫。

如果我正确理解了您的需求,您可以首先让您的lambda函子接受适当类型的参数(此处通过引用传递,因此请注意生存期问题):

doSomething([](QNetworkReply* p)
{
    // Here you have the sender referenced by p
});

然后,您的doSomething()模板函数可以使用std::bind()来确保您的lambda将以适当的对象作为参数调用:

template<typename Functor>
void MyClass::doSomething(Functor f)
{
    connect(network_reply, &QNetworkReply::finished, bind(f, network_reply));
    //...
}