Простым способом является использование QObject::sender()
в слоте для нажатия кнопки, чтобы узнать, какая кнопка выдала сигнал. Затем вы должны перебрать вектор кнопок:
QObject* obj = sender();
for(int i=0;i<buttonVector.count();i++)
{
if(obj == qobject_cast<QObject *>(buttonVector[i]))
{
...
}
}
Один из способов заключается в использовании QObject::setObjectName
и установить некоторые имена кнопок вы добавляете:
button.setObjectName(QString("%1").arg(i));
И в слоте вы можете получить номер кнопки используя имя объекта:
void MainWindow::buttonClicked()
{
QPushButton *button = qobject_cast<QPushButton *>(QObject::sender());
int number = button->objectName().toInt();
}
Другой способ заключается в использовании QSignalMapper
класс, который собирает набор сигналов без параметров, и повторно излучает их с г nteger, string или widget, соответствующие объекту, который отправил сигнал. Таким образом, вы можете иметь один, как:
QSignalMapper * mapper = new QSignalMapper(this);
QObject::connect(mapper,SIGNAL(mapped(int)),this,SLOT(buttonClicked(int)));
Когда newing ваши кнопки, вы можете подключить clicked()
сигнал кнопки на map()
слот QSignalMapper
и добавить отображение с помощью setMapping
так, что, когда clicked()
сигнализируется с помощью кнопки, сигнал mapped(int)
испускается:
button = new QPushButton();
QObject::connect(button, SIGNAL(clicked()),mapper,SLOT(map()));
mapper->setMapping(button, i);
Таким образом, при нажатии кнопки, mapped(int)
сигнала преобразователя испускается, содержащим номер кнопки и, следовательно, buttonClicked
называется остроумием h - параметр, содержащий номер кнопки.
Существует также QButtonGroup, хотя для этого варианта использования сопоставим с QSignalMapper –
QSignalMapper - прекрасное решение, которое мне удалось реализовать. Единственное, что мне показалось немного раздражающим, это тот факт, что если я удалю кнопку, мне придется управлять сопоставлениями вручную, поскольку mapping-> removeMapping() не изменяет размер. Спасибо @ Негат! – lachycharts