在 for 循环中使用 lambda 函数连接信号槽
Posted
技术标签:
【中文标题】在 for 循环中使用 lambda 函数连接信号槽【英文标题】:Connecting Signal Slots using lambda function in for Loop 【发布时间】:2019-04-12 12:41:21 【问题描述】:我需要为插槽添加一个额外的参数(2 个参数),同时连接一个只有一个参数的信号,用于多个相同类型的小部件。
所以我创建了一个 Widget
对象的向量,尝试在 for 循环中使用 lambda 函数建立连接。
这是我尝试过的示例:
QWidget* widget1, widget2, widget3, widget4;
/*...
Assign memory to them
...*/
QVector <QWidget> m_widgetVec = widget1, widget2, widget3, widget4
for(int i=0; i < 4; i++)
connect(m_widgetVec[i], &QWidget::clicked, [&](bool state)
myfunc(i, state);));
当我收到的状态执行值正常,但i
的值始终为 0。
我希望i
是 0,1,2,3。对于小部件 1、2、3、4。
有什么建议吗? 感谢您的帮助。
【问题讨论】:
【参考方案1】:您的 lambda 使用通过引用捕获 [&]
,因此 lambda 内的 i
只是对 for
循环控制变量的引用(甚至在循环终止后立即成为悬空引用)。你想要的是按值捕获i
:
[i](bool state)myfunc(i, state);
如果myfunc
是该类的成员,您还需要捕获this
:
[i, this](bool state)myfunc(i, state);
或者只是按价值捕获所有内容:
[=](bool state)myfunc(i, state);
【讨论】:
【参考方案2】:index
的运行时值是多少?
您不想连接m_widgetVec[i]
而不是m_widgetVec[index]
吗?
【讨论】:
是的,这是我的错字,确实是 m_widgetVec[i] 而不是 m_widgetVec[index]。感谢您指出这一点以上是关于在 for 循环中使用 lambda 函数连接信号槽的主要内容,如果未能解决你的问题,请参考以下文章