如何在C++lambda中访问QObject::sender
How to access QObject::sender in a C++ lambda?
这是一个相当不寻常的问题,但仍然是一个问题。我有一个函数,它接受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));
//...
}
相关文章:
- 删除 QSharedPointer 指向的 QObject
- QObject::连接无法将信号连接到*this*对象的插槽
- 调试符号中缺少 QObject 类信息(编辑但存在其他 Qt 类)
- QML/C++/QObject Struct Copy
- QObject::d eleteLater在我的Qt测试中没有像预期的那样调用
- 具有 QObject 继承的单例 - Qt
- QObject::连接不起作用 - 使用函数语法找不到信号
- 是否可以在单独的线程中将 QObject 设置为 QML 上下文属性?
- 智能指针作为 QObject::d eleteLater() 的替代品
- Shiboken2 qobject.h:46:10:致命:找不到'QtCore/qobjectdefs.h'文件
- 在 dll 中为 qLibrary 编译 qobject 时出错
- 将复制构造函数设置为默认值在继承自 QObject 时不起作用
- 我应该使用多个角色还是一个角色,将实际属性推迟到将数据包装/公开为其属性的QObject
- 在另一个线程上发出 QObject 信号的正确方法?
- 为什么 QObject::d isconnect(const QMetaObject::Connection &connection) 采用 const 参数并打算修改它?
- 在 QObject 方法中生成 QWidgets
- 我可以自动处理继承 QObject 的仅标头对象吗?
- QT 库 QObject::connect: 无法连接 (null)::done() 到 MainWindow::upd
- QObject::sender() 在插槽中无法正常工作
- 如何在C++lambda中访问QObject::sender