在 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 使用通过引用捕获 [&amp;],因此 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 函数连接信号槽的主要内容,如果未能解决你的问题,请参考以下文章

Python lambda不记得for循环中的参数[重复]

python易错题之lambda 以及 for循环中内嵌函数

for循环中的lambda只取最后一个值[重复]

for循环中的lambda只取最后一个值[重复]

for循环中的lambda只取最后一个值[重复]

使用 lambda 函数了解 QProcess 信号的行为