#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");
Комментариев нет:
Отправить комментарий