Допустим у нас приложение "Калькулятор". Имеется 9 кнопок с цифрами дабы не связывать каждое нажатие отдельной кнопочки с одним и тем же слотом обрабатывающим вывод цифры на табло и не плодить код, есть прекрасный класс в Qt - QSignalMapper
Простой пример:
В заголовочном файле декларируем:
QSignalMapper *signalMapper;
И тут же создаем приватный слот:
void clicked(const QString & text);
Который будет выводить сообщение с текстом нажатой кнопочки
Далее в конструкторе класса создаем объект класса QSignalMapper
signalMapper = new QSignalMapper(this);
Далее добавляем в QGridLayout yнаши 9 кнопочек:
for (int i = 0; i < 9; ++i) { //Кнопочка с текстом текущей итерации цикла QPushButton *button = new QPushButton(QString::number(i)); //При нажатии на данную кнопочку вызывам слот класса QSignalMapper connect(button, SIGNAL(clicked()), signalMapper, SLOT(map())); //Привязывем кнопочку к маперу с текстом текущей итерации signalMapper->setMapping(button, QString::number(i)); //ну и добавляем кнопочку в Layout ui->gridLayout->addWidget(button, i / 3, i % 3); } //Теперь когда маппер испуска сигнал о нажатии определенной кнопочки вызывается наш слот //и в него передается значение привязанное в мапер для данной кнопочки connect(signalMapper, SIGNAL(mapped(const QString &)), this, SLOT(clicked(const QString &)));
//А вот и сам наш слот
void MainWindow::clicked(const QString & text) { QMessageBox::information(this, "TEST", text, QMessageBox::Ok); }
|