Подключение сигнальных слотов с помощью лямбда-функции в Loop - PullRequest
0 голосов
/ 12 апреля 2019

Мне нужно добавить дополнительный аргумент в слот (2 аргумента) при соединении с сигналом только с одним аргументом для нескольких виджетов одного типа.Поэтому я создал вектор из Widget объектов, попытался создать соединения с помощью лямбда-функции в цикле for.

Вот иллюстрация того, что я пробовал:

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принять для состояния в порядке, но значение i всегда равно 0. Я ожидаю, что i будет 0,1,2,3.для виджетов 1,2,3,4.

Есть предложения?Ценю вашу помощь.

Ответы [ 2 ]

4 голосов
/ 12 апреля 2019

Ваша лямбда использует захват по ссылке [&], поэтому i внутри лямбды является только ссылкой на управляющую переменную цикла for (и даже становится висячей ссылкой, как только цикл завершается).Вам нужно захватить i по значению:

[i](bool state){myfunc(i, state);}

В случае, если myfunc является членом какого бы класса он ни находился, вам также нужно будет захватить this:

[i, this](bool state){myfunc(i, state);}

Или просто захватить все по значению:

[=](bool state){myfunc(i, state);}
0 голосов
/ 12 апреля 2019

Какое значение времени выполнения index?

Разве вы не хотите подключиться m_widgetVec[i] вместо m_widgetVec[index]?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...