Страницы

Поиск по вопросам

пятница, 11 января 2019 г.

Как передать переменную в функцию при помощи сигнал-слота?

Начал изучать Qt и в качестве закрепления информации решил создать проект, в котором вектор пушБаттонов будет посылать сигнал в функцию, функция в свою очередь производит вычисления, сохраняет в SQLite базу и выводит на соответствующий ЛайнЕдит (тоже вектор). Однако, на этапе объединения, кнопки и функции, я столкнулся с трудностями так как не знаю, как это можно правильно организовать.
Моя изначальная идея была в том, чтобы создать цикл, который бы объединял баттоны с функцией и передавал значения i, для определения с какой именно кнопки поступил сигнал, что вроде этого:
for(int i = 0; i < max; i++) { QObject::connect(button[i], &QPushButton::clicked, this, MainWindow::function); }
Однако, я не нашел способа передать значение i в функцию. Слышал про QSingalMapper и использования лямбды, но из-за недостатка опыта так и не разобрался как это можно реализовать.
Буду признателен, если продемонстрируете, как в таком случае можно перекинуть i внутрь функции. Или, если моя идея неверна в принципе, предложите другой вариант ее реализации.


Ответ

С использованием лямбда-функций всё намного проще:
connect(button[i], &QPushButton::clicked, this, [=] () { function(i); });
В зависимости от того какие переменные необходимо захватить в контекст лямбда-функции, слот может выглядеть по-другому:
connect(button[i], &QPushButton::clicked, this, [this, i] () { function(i); });
Такой функционал доступен, начиная с C++11

Комментариев нет:

Отправить комментарий