在 for 循环中使用 lambda 函数连接信号插槽

Connecting Signal Slots using lambda function in for Loop

本文关键字:函数 连接 信号 插槽 lambda for 循环      更新时间:2023-10-16

>我需要向插槽添加一个额外的参数(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。

有什么建议吗?感谢您的帮助。

您的 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);}

index的运行时值是多少?

你不想连接m_widgetVec[i]而不是m_widgetVec[index]吗?