【问题标题】:Connecting Signal Slots using lambda function in for Loop在 for 循环中使用 lambda 函数连接信号槽
【发布时间】: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。

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

【问题讨论】:

    标签: c++ qt c++11


    【解决方案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]。感谢您指出这一点
      猜你喜欢
      • 2018-02-28
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多