Страницы

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

четверг, 2 января 2020 г.

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

#cpp #qt #qt5


Начал изучать Qt и в качестве закрепления информации решил создать проект, в котором
вектор пушБаттонов будет посылать сигнал в функцию, функция в свою очередь производит
вычисления, сохраняет в SQLite базу и выводит на соответствующий ЛайнЕдит (тоже вектор).
Однако, на этапе объединения, кнопки и функции, я столкнулся с трудностями так как
не знаю, как это можно правильно организовать.

Моя изначальная идея была в том, чтобы создать цикл, который бы объединял баттоны
с функцией и передавал значения i, для определения с какой именно кнопки поступил сигнал,
что вроде этого: 

for(int i = 0; i < max; i++) {
    QObject::connect(button[i], &QPushButton::clicked, this, MainWindow::function);
}


Однако, я не нашел способа передать значение i в функцию. Слышал про QSingalMapper
и использования лямбды, но из-за недостатка опыта так и не разобрался как это можно
реализовать.

Буду признателен, если продемонстрируете, как в таком случае можно перекинуть i внутрь
функции. Или, если моя идея неверна в принципе, предложите другой вариант ее реализации.
    


Ответы

Ответ 1



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

Ответ 2



Эту задачу решает QSignalMapper signalMapper = new QSignalMapper(this); for (int i = 0; i < N; ++i) { //создали кнопку QPushButton *button = new QPushButton(texts[i]); //привязали к мэпперу connect(button, SIGNAL(clicked()), signalMapper, SLOT(map())); //указали, что кнопка мэппится в int signalMapper->setMapping(button, i); } //связываем сигнал из мэппера со слотом connect(signalMapper, SIGNAL(mapped(int)), this, SIGNAL(clicked(int)));

Ответ 3



Так же, как альтернатива, можно использовать property: for(int i = 0; i < button.size(); i++) { button[i]->setProperty("index", i); QObject::connect(button[i], &QPushButton::clicked, this, &MainWindow::function); } а в function: QPushButton *button = qobject_cast(sender()); int index = button->property("index");

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

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