QT5. QpushButton signal clickcked, QSpinBox value to slot

QSpinBox *freq = new QSpinBox(this);
freq->setMinimum(50);
QPushButton* start = new QPushButton("Запустить",this);

QSignalMapper *signalMapper = new QSignalMapper(freq);
connect(start, SIGNAL(clicked()), signalMapper, SLOT(map()));
signalMapper->setMapping(start, freq->value());
connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(startPump1(int)));

void MainWindow::startPump1(int val) {
   qWarning() << val;
}

The value is transmitted to the slot, but only what is set (50). After changing the value, 50 is still transmitted. How to transfer the changed value by clicking on the button. Thanks !


Ответы (1 шт):

Автор решения: maestro

QSignalMapper используется, когда у вас есть массив однотипных объектов, которые могут выдавать одинаковые сигналы, и обрабатывать их надо одинаковым образом. То есть у вас должно быть несколько QSpinBoxов.

Перегрузка метода QSpinBox::setMapping, которую вы выбрали, принимает 2 аргумента: источник сигнала (вы его указали правильно) и идентификатор, который будет передан в слот при генерации сигнала. То есть значение value() было вычислено один раз при вызове метода setMapping, и больше ни разу не менялось.

Вот как будет правильно передавать значение value в слот при использовании массива QSpinBox.

QList<QSpinBox*> boxes;
boxes.append(new QSpinBox(this)); //Наполняем массив тремя элементами. А их минимальное значение установите сами.
boxes.append(new QSpinBox(this));
boxes.append(new QSpinBox(this));

QSignalMapper *signalMapper = new QSignalMapper(this);
for (int i = 0; i < boxes.count(); i++)
{
    const QSpinBox *box = boxes.at(i);
    connect(box, SIGNAL(clicked()), signalMapper, SLOT(map()));
    signalMapper->setMapping(box, i); //Задаём идентификатор отображения. В слот будет передан индекс элемента в массиве `boxes`.
}
connect(signalMapper, SIGNAL(mapped(int)), this, SLOT(startPump1(int)));
void MainWindow::startPump1(int val) {
   qWarning() << boxes[val].value();
}
→ Ссылка